Skip to content

Kernel-source

  • Published on
    커널 학습에서 실제로 가장 자주 쓰게 되는 기술은 읽기가 아니라 찾기입니다. 어떤 트리를 받을지부터 정리합니다. mainline, stable, longterm이 각각 무엇이고 kernel.org의 릴리스 표를 어떻게 읽는지, torvalds 트리와 stable 트리 중 무엇을 clone해야 하는지, 얕은 복제가 언제 손해로 돌아오는지를 다룹니다. 그다음이 이 글의 본론입니다. 알고 있는 동작 하나에서 출발해 그것을 구현한 커널 함수에 도달하는 경로를 실제 명령으로 보여 줍니다. ripgrep과 grep의 실전 패턴, make cscope와 make tags가 만들어 주는 인덱스, 그리고 매크로가 이름을 생성하기 때문에 순진한 grep이 실패하는 대표적인 경우를 시스템 콜 테이블에서 SYSCALL_DEFINE까지 따라가며 설명합니다. 마지막으로 MAINTAINERS 파일의 필드 표기를 읽어 어느 코드가 누구 소관인지 알아내는 법과 Documentation 트리를 검색 대상으로 쓰는 법을 정리합니다.
  • Published on
    커널이 읽을 수 있는 코드라는 것을 확인하는 가장 좋은 방법은 시스템 콜 하나를 처음부터 끝까지 따라가 보는 것입니다. read(2)를 골라 사용자 공간의 호출부터 커널 안의 실제 구현, 그리고 반환까지 실제 파일 경로와 함수 이름과 함께 추적합니다. x86_64에서 인자가 어느 레지스터에 실려 오는지, do_syscall_64가 번호를 어떻게 함수로 바꾸는지, SYSCALL_DEFINE3 매크로가 실제로 어떤 함수 셋을 만들어 내며 그래서 왜 sys_read를 grep해도 나오지 않는지를 매크로 정의를 펼쳐 보여 줍니다. 이어서 fs/read_write.c의 ksys_read와 vfs_read를 한 줄씩 읽으며 파일 디스크립터가 struct file이 되는 과정, 파일 오프셋이 다뤄지는 방식, 함수 포인터 테이블로 파일시스템별 구현이 선택되는 지점을 확인합니다. 마지막으로 커널이 왜 사용자 포인터를 그냥 역참조하지 않는지, 그리고 반환값이 왜 음수 errno인지를 다룹니다.
  • Published on
    리눅스 커널을 공부하겠다고 마음먹은 사람이 가장 먼저 부딪히는 것은 개념이 아니라 규모입니다. 실제로 트리를 받아 세어 본 숫자로 커널이라는 코드베이스가 어떤 물건인지 먼저 보여 주고, 그중 몇 퍼센트를 평생 열어 볼 일이 없는지 정직하게 짚습니다. 그다음 현실적인 진입 경로를 읽기·관측·기여 세 갈래로 나눠 각각이 누구에게 맞는지, 왜 처음부터 순서대로 읽겠다는 계획이 거의 항상 실패하는지 설명합니다. 마지막은 전제 조건입니다. C와 포인터와 빌드 시스템은 정말로 필요하고, 어셈블리 전문성과 하드웨어와 학위는 필요하지 않다는 것을 근거와 함께 정리했습니다. 이 글은 운영체제 이론을 다시 가르치지 않습니다. 커널의 동작을 설명하는 글이 아니라, 그 동작을 구현한 코드를 직접 찾아 읽기 시작하기 위한 지도입니다.