리눅스 인터럽트 핸들러 부팅과정 분석

리눅스에서는 인터럽트를 호출되기 위해서는 최소한 한번의 등록이 필요하다. 이는 부팅과정에 이루어지며 인터럽트의 예는 USB나 키보드 입력등이 흔한 예다. 아래는 부팅중에 하나의 인터럽트의 코드중하나이다. https://github.com/raspberrypi/linux/blob/rpi-4.19.y/drivers/usb/host/dwc_otg/dwc_otg_driver.c 인터럽트를 등록하는 함수는 request_irq이며 안에는 request_threaded_irq을 호출하는거말구 아무것도 안한다. 부팅중의 IRQ의 등록을 확인하기 위하여 위에 코드에 if문을 추가해 콜스택을 출력해주는 함수를 작성하고 리눅스 컴파일을 하여 재부팅을 시켜주자. 재부팅이 완료되면 /var/log/kern log을 소개 더보기 리눅스 인터럽트 핸들러 부팅과정 분석[…]

비동기..? 동기, 블록, 논블록 도대체 뭔대!

최근 한 후배가 나에게 비동기 블록킹 이런식으로 이야기를 많이 해주었는데 이 위에 있는 차트를 보고 그런식으로 말했다고 한다. 위그림은 잘못된 지식으로 만들어졌고 이로 인해서 공부하는분조차 블록킹 논블록킹 동기를 헤갈리게 만든다. 어째서 select가 비동기에 블록이라는건가. 이는 비동기를 매우 매우 잘못알고 있는 뜻이라는 것이다. msdn이나 linux조차도 동기라고 문서에 적혀있다. 도대체 그럼 블록,논블록가 무엇이고 비동기,동기는 무엇인가? 라고 물어보시는 소개 더보기 비동기..? 동기, 블록, 논블록 도대체 뭔대![…]

리눅스 커널 인터럽트 진입시 현재상태 저장

리눅스는 인터럽트 발생시 빠르게 레지스터값을 저장한다. 저장하는 함수는 __irq_svc이다. 이 코드는 어셈은 다음과 같다. https://github.com/raspberrypi/linux/blob/abaa3760da89d6fb38e55473fffc9a31dd0b1d7a/arch/arm/kernel/entry-armv.S#L206 좀 더 자세히 알아보기위해 어셈코드를 확인해보자. 커널을 빌드할때 심볼값인 System.map을 확인하자. __irq_svc의 함수의 시작은 0xc0009940 이고 끝나는 지점은 0xc00099bc 알수 있다. 다음은 위 커맨드를 입력한 출력값이다. 다음은 stm명령어를 통해 레지스터값을 전부 스택에 저장한다. http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ik/Cihcadda.html

스팀의 게임 초대의 원리

몇몇 해외 게임 서버는 dedicate server을 이용하고 있다. 하지만 게임 초대시 NAT인 상태인 데도 불구하고 게임 초대가 되는거를 알수있다. 일반적인 유저면 초대가 되야지라고 생각하겠지만 방장이 NAT인 경우는 초대가 안되야 정상이다. 왜냐하면 라우터에서 외부에서 내부로 패킷이 들어올때 포트포워딩이나 DMZ가 안되어있는경우는 패킷이 들어올수 없기 때문이다. 이도 스팀이 인지를 해서 별도의 라이브러리를 제작하였는데 이는 공식 문서에서도 확인할수 있다. 소개 더보기 스팀의 게임 초대의 원리[…]

커널에 do while 매크로가 있을까?

리눅스 커널을 보면 아래와 같이 do {} while 매크로가 있다. https://github.com/raspberrypi/linux/blob/f6b3ac28f0a9137d4c24c0b8832e693bbd16f5b7/include/linux/hardirq.h#L36 do ~ while로 매크로 함수를 사용하는 두가지 이유가 있다. 첫째는 {} 을 통해서 중복이름을 막는다. 매크로 함수는 말그대로 컨트롤 C+V효과를 동일한 효과가 있어 중복이름이 있을때 undefined behavior이 된다. 이를 방지 하기 위해 블록을 사용한다. 둘째 ; 을 강제화한다. 여러개의 함수를 define을 하게되면 ;을 포함해서 소개 더보기 커널에 do while 매크로가 있을까?[…]

리눅스 커널 매크로 함수 없이보기

리눅스 커널 코드를 보게되면 수많은 매크로 함수를 확인할수있는데 이는 소스코드를 보기어렵게 만들어주는 요소이다. 이를 해결하기위해 전처리한 코드를 보는 GCC옵션이 있다. –save-temps 라는 옵션이며 이 옵션을 설정하기 위해서는 리눅스 커널의 코드의 ~/위치에 MakeFile안에 다음과 같이 소스코드를 추가한다.

[리눅스커널] 커널의 특정 함수 어셈 확인하기

리눅스 커널을 컴파일하게되면 System.map이라는 폴더가 나옵니다. 위 파일을 리눅스 커널에 들어 있는 심벌에 대한 정보를 담고있습니다. 한 예로 sys_sigreturn_wrapper라는 함수의 코드를 확인해볼려고합니다. sys_sigreturn_wrapper의 범위는 0x80101834~0x80101840까지입니다. 그러면 다음과 같은 커맨드를 입력해줍니다.

WINAPI INSTANCE란 도대체 무엇일까?

최근에 디버깅 관련해서 보고있습니다. 책중에서 winapi중에 INSTANCE이 값이 도대체 무엇인가 라는 답 하나를 찾았습니다. 결론부터 말하면 PE구조의 imagesBase + entry Point 값입니다 샘플코드는 VS에서 기본적으로 제공하는 Windows Project 코드입니다. 테스트 하기위해 아래에 randomized base address을 해제하겠습니다. 이 기능은 WIndows에서 Images Base 주소를 랜덤으로 해주는 기능입니다. 이 기능을 해제한후에 디버깅을 한뒤에 wWinMain의 인스턴스를 봐주시기 바랍니다. 해당 소개 더보기 WINAPI INSTANCE란 도대체 무엇일까?[…]

RSA 암호화 구현

필자는 수학을 못하기때문에 왜 이게 이렇게 되는지 아직두 잘 모르겠다. 그래서 이글은 stap by step으로 구현에 대해 이야기를 할것이다. RSA는 아래의 flow을 따라간다. 두개의 소수를 찾는다. 공개키를 만든다. 공개키 기반으로 개인키를 만든다. 데이터를 암호화 복호화을 해본다. 1. 두개의 소수를 찾는다. 공개키를 만들기위해서는 총 두가지의 다른 소수가 필요하다. 필자는 이키를 p와 q라고 부를거고 p를 11로 q를 소개 더보기 RSA 암호화 구현[…]