본문 바로가기

전체 글

입대 전 생각 정리 최근 2달동안 미친듯이 달렸다. 개인적으로 진행하고 있는 프로젝트가 있는데, 낮에는 팀 프로젝트를 진행하고 집에 와서는 새벽까지 리눅스 커널을 보는 것을 반복했다. 그동안 느낀 것도 있고, 또 입대도 19일 남고 하니 이런저런 생각을 정리해본다. 문서화와 커밋 메시지는 정말 중요하다. 이전까지는 제대로 git을 쓰는 법을 몰랐다. 보통 1 - 3인 정도에서 소규모로 프로젝트를 진행할 때는 카톡 정도로 의사소통 해도 해결이 되었다. 심지어 문서화는 제대로 하지도 않았다. 하지만 커널을 공부하면서, 프로젝트 바깥에서 참여를 하려고 하니 눈앞이 깜깜했다. 문서도 부족하다고 느꼈다. 그리고 패치를 보내다 보니, 리뷰하는 사람이 쉽게 이해할 수 있도록 커밋을 잘게 쪼개고 메시지도 명확하게 남기는 게 중요했다. 프.. 더보기
[Linux Kernel] 문자 디바이스 드라이버 (Blocking IO) 이 글은 가상 파일시스템, 문자 디바이스 드라이버 작성, 세마포어를 어느 정도 이해한다고 가정한다. 이 글에서는 wait queue라는 인터페이스를 소개하고 wait queue로 Blocking IO를 구현하는 방법에 대해 설명할 것이다. Non-blocking IO가 되게 간단하긴 한데 지금 공부하기가 싫으니 다음 번에 Non-blocking IO & Async IO로 같이 글을 써야겠다. Blocking vs Non-blocking IO 일반적으로 우리가 open을 통해서 여는 파일에 작업을 하면, blocking 방식으로 처리하게 된다. blocking IO 파일에 대하여 read를 호출했으나 아직 읽을 내용이 없을 때, write를 했으나 아직 데이터를 버퍼에 쓸 수 없을 때, open을 했으나 .. 더보기
[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가 작을수록 오차가 더 줄어드므로 시간의 해상도가 높아진다. 다만 초당 인터럽트 발생 수가 높아지면 그만큼 인터럽트 처리를 위한 오버헤드가.. 더보기