박강민(pr0gr4m) / Linux Kernel Contributor - <Linux Kernel 101 for Beginner>
"리눅스 커널에 관심은 있지만, 커널을 어떻게 공부해야 하는지 모르는 분들을 위해 준비한 시간입니다.
입문자 분들이 리눅스 커널 공부를 시작하는 방법에 대해 소개합니다"
영상: https://youtu.be/96T6OCEqZNk
주최: https://www.facebook.com/groups/InfraEngineer
8. System Call
User Application
open
Library(x86,arm,…)
Interrupt Vector
read exit
fork
write
sys_open sys_read sys_exit
sys_clone
sys_write
vfs_open vfs_read do_exit
kernel_clone
vfs_write
File System (ext/proc/debugfs/…) Kernel Driver
User
Space
Kernel
Space
virtual filesystem
11. More?
• 다음 함수들을 호출했을 때 커널에서 어떤 함수가 호출되는지 조
사하기
• fork, vfork, pthread_create, execl, exit, open, read, write, close, malloc, mmap
• 가상머신에 리눅스를 설치한 후, 직접 커널을 빌드해서 부팅
• Linux Kernel Build - Linux Kernel Analysis (pr0gr4m.github.io)
• 커널 소스에 자기가 만든 시스템콜을 새로 추가하고, 유저 스페이
스에서 해당 시스템콜을 사용해보기
• [Linux Kernel 5] system call 추가하기 (tistory.com)
14. How to Study
• 커널에 적용되어 있는 개념과 기능들을 공부합니다
• 커널에 정의된 구조체와 함수가 어떤 역할을 하는지 공부합니다
• 커널 함수들이 언제 어떻게 동작하는지 트레이싱합니다
• 커널 소스코드를 주석과 커밋로그를 참고하여 분석합니다
• 커널 컨트리뷰트를 수행합니다
19. Basic
• struct task_struct
• 커널에서 프로세스/쓰레드를 관리하기 위한 구조체
• struct mm_struct
• 프로세스에 할당된 메모리를 관리하기 위한 구조체
• struct irq_desc
• 인터럽트 요청을 표현하기 위한 디스크립터 구조체
• struct sk_buff
• 소켓 버퍼를 관리하기 위한 구조체
• kernel_clone()
• 새로운 프로세스/쓰레드를 만들기 위한 함수
• kmalloc()
• 커널에서 메모리를 할당받기 위한 함수
• request_irq()
• 인터럽트 핸들러를 등록하는 함수
• inet_init()
• 여러 네트워크 프로토콜들을 초기화하는 함수
20. More and More
• 방금 전에 소개된 구조체와 함수들을 엘릭서에서 찾아보고 주석
을 참고하여 커널에서 어떤 역할을 하는지 조사하기
• 커널을 수정하여 시스템에서 kernel_clone() 함수가 몇 번 호출되
었는지 카운팅하고, 새로운 시스템콜 get_kernel_clone_count() 만
들어 유저 스페이스에서 kernel_clone() 함수가 호출된 횟수 구하
기
• 커널을 수정하여 수신하는 패킷들 중 로컬 호스트로 들어오는 패
킷들을 다음 그림과 같이 덤프하여 커널 메시지로 출력하기
• ip_local_deliver_finish()
• dmesg –w
21. Contribute
• 빌드 환경 구축
• 소스 코드 분석
• commit target 발견
• 소스 코드 수정 및 테스트
• git patch 파일 생성
• patch mail 발송
• review에 따라 patch 재생성
• accept or reject
22. Commit
• Fix Typo (오타 수정)
• Cleanup
• 코드 스타일 교정
• 불필요한 코드 제거
• 사용하지 않는 변수 제거
• 변수/함수 타입 변경
• Optimize (최적화)
• Improve (성능 향상)
• Bugfix (버그 수정) - syzbot
• Introduce (새로운 컨셉)
23. Patch Mail
• 어떻게 리눅스 커널 개발을 하는가 — The Linux Kernel
documentation
• [Linux Kernel] 리눅스 커널 개발 가이드: Introduction
(hyeyoo.com/110)
• Linux Kernel 개발참여방법과 문화 (Contribution)
(slideshare.net/UbuntuKorea/linux-kernel-contribution)
• 리눅스 커널 패치와 커밋 - YES24