본문 바로가기

전체 글

[Linux Kernel] 주소와 메모리 공간 이 글은 LDD3을 공부하면서 정리하였고 필요한 내용을 그때그때 추가했다. 사용자 프로세스 관점에서 바라보는 주소 공간과 커널 관점에서 바라보는 것은 매우 다르기 때문에 이를 이해할 필요가 있다. 이 글을 읽으려면 페이징, 가상 파일 시스템, 그리고 Memory-Mapped IO를 어느 정도 이해하고 있어야 한다. 처음엔 커널에서 왜 무작정 userspace의 주소에 접근하면 안되는지 이해하지 못했고, 왜 그러면 안되는지도 몰랐는데 이걸 공부하고 나니까 이해가 됐다. 역시 Greg 아저씨 짱짱맨... ㄹㅇ... 발끝이라도 따라가고 싶다. 이 글에선 커널과 사용자 프로세스의 관점에서 주소와 메모리 공간이 어떻게 이루어져있는지 살펴볼 것이다. 다음 글에선 이번 글에서 다룬 내용을 바탕으로 디바이스 드라이버에.. 더보기
[Linux Kernel] 고민과 공부 방향 정리 리눅스 커널은 정말 진입 장벽이 높다. 이제 제대로 공부를 시작한지는 2개월 정도 됐는데, 주요 서브시스템들 (I/O, pci, usb, address space, memory management, timer, ... 등등) 을 공부해도 당장 개발을 시작하기는 어렵다. 지금 보는 책이 아래 정도인데 커널 개발에 있어 정말 필수적인 지식들, 그리고 어느 정도 깊이 있는 지식들도 약간 다룬다. Linux Device Drivers book - Bootlin A must-have book for people creating device drivers for the Linux kernel! Now available in a single PDF file. Linux Device Drivers from Jonath.. 더보기
[Linux Kernel] 첫 의미있는 기여 경험 (mm, slub) 리눅스 커널에 커밋 해보자 리눅스 커널에 커밋해보자! 리눅스 커널에 커밋한다는 건 정말 멋진 일이다. 하지만 나는 아직 쪼렙이기 때문에 커널의 중요한 파트에 기여할 수는 없다. 하지만 리눅스 커널에 커밋하기 위해서 hyeyoo.com 올해 3월에 썼던 글, drivers/staging에서 코딩 스타일을 고쳐서 보내봤다. 후기 먼저 적어보자면.. 지금까지 기여했던 건 staging 디렉토리에서 코딩 스타일을 고치거나, 주석의 오타를 고치는 정도의 trivial한 패치였다면 이번에는 약간의 (?) discussion을 거쳐서 기여했다. 패치 자체는 대단한 내용은 아니다. 하지만 과정이 너무 재미있었고 좋은 경험이어서 자세하게 기록을 남겨본다. 이전까진 오픈소스가 모두에게 열려있다는 걸 머릿속으로만 알고있었는.. 더보기
군대 간다악 군대에선 보통 뭐로 코딩을 할까? ㅋㅋㅋㅋ 가서 리눅스 커널이랑 알고리즘좀 공부해야지. 더보기
[Linux Kernel] 메모리 할당 이번 글에선 디바이스 드라이버 관점에서 메모리 할당에 관하여 다룬다. 메모리 관리 기법, 주소 공간에 대해서는 다루지 않는다 주소와 메모리 공간은 아래 글을 참고하자. [Linux Kernel] 주소와 메모리 공간 이 글은 LDD3을 공부하면서 정리하였고 필요한 내용을 그때그때 추가했다. 사용자 프로세스 관점에서 바라보는 주소 공간과 커널 관점에서 바라보는 것은 매우 다르기 때문에 이를 이해할 필요 hyeyoo.com kmalloc, kfree /** * kmalloc - allocate memory * @size: how many bytes of memory are required. * @flags: the type of memory to allocate. * * kmalloc is the normal.. 더보기
[Linux Kernel] 시간과 타이머 이번 글에선 시간 관련 코드를 짜는 방법을 다뤄보겠다. 타이머도 다룰 건데, low resolution timer (보통 'the timer wheel'이라고 언급된다.)를 다룰 것이다. high resolution timer나 bottom-half에서 사용하는 softirq, tasklet, workqueue 등도 다루려 했으나 워낙 방대해서 천천히 글로 남겨볼 생각이다. 시간의 측정 타이머 인터럽트와 jiffies 커널의 시간은 타이머 인터럽트를 통해 관리된다. 타이머 인터럽트는 초당 10번, 초당 1000번 처럼 정해진 빈도가 있으며, 이는 HZ로 정의되며, HZ가 작을수록 오차가 더 줄어드므로 시간의 해상도가 높아진다. 다만 초당 인터럽트 발생 수가 높아지면 그만큼 인터럽트 처리를 위한 오버헤드가.. 더보기
[Linux Kernel] 인터럽트와 후반부 처리의 개념 Interrupt 컴퓨터는 프로세서만으로 이루어져있지 않다. 디스크로부터 데이터를 읽고 쓰거나, 네트워크 카드로부터 데이터가 들어오거나, 사용자가 마우스나 키보드로 입력을 할 수 있다. 이처럼 프로세서는 주변 장치로부터 어떤 이벤트가 발생했다는 것을 처리할 방법이 필요한데, 그것이 바로 인터럽트이다. 마우스로 무언가를 입력하면 프로세서는 실행을 잠시 중단하고, 마우스가 발생시킨 인터럽트를 처리한 후 다시 원래 실행하던 코드로 돌아간다. 그런데 마우스가 발생시키는 인터럽트와 키보드가 발생시키는 인터럽트는 다를 것이다. 커널은 서로 다른 인터럽트에 IRQ 번호를 부여하여 관리한다. 또한, 부팅시, 혹은 실행 중에 IRQ 번호에 따라 인터럽트 핸들러라는 함수를 미리 등록하여, 인터럽트가 발생했을 때 실행될 콜.. 더보기
[Linux Kernel] semaphore (3) - 수정, 테스트 해보기 패치를 작성하게 된 이유 semaphore를 분석하다가, struct semaphore의 lock이 좀 성긴 (coarse 한) 것 같아서, semaphore_waiter을 관리하는 락을 reader / writer 락으로 분리해서 성능을 테스트 해봤다. 락을 현재 획득한 프로세스가 writer, wait_list에서 대기중인 프로세스가 reader이므로 rwlock_t를 사용하면 더 빨라질거라고 생각했다. 패치 파일은 아래와 같다. benchmark 이 패치를 메인테이너한테 받아달라고 설득하려면, 이게 성능을 개선한다는 지표가 필요했다. 그래서 간단한 테스트 코드를 작성해보았다. 테스트는 make bzImage, make install로 이미지 설치, 빌드 후에 해당 커널로 부팅해서 모듈을 실행했다. .. 더보기