algorithm and 디버깅을 통해 배우는 리눅스 커널의 구조와 원리
leetcode - 1296(Remove Nth Node From End of List)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
|
디버깅을 통해 배우는 리눅스 커널의 구조와 원리
-
2장
-
커널 빌드(리눅스에서 소스코드 받아서 빌드 하면 됨)
-
리눅스 커널의 소스 구조
-
arch
-
arm: 32비트 계열 ARM 아키텍처 코드가 있으며, 라즈비안도 이 하부 디렉터리 코드를 실행합니다.
- arm64: 64비트 계열 ARM 아키텍처 코드가 있습니다.
-
x86: 폴더 이름과 같이 인텔 x86 아키텍처 코드가 있습니다.
-
include
-
Documentation: 커널 기술 문서가 있는 폴더. 커널 개발자를 대상으로 작성된 문서이기에 꽤 어려움
-
kernel
-
irq: 인터럽트 관련 코드
- sched: 스케줄링 코드
- power: 커널 파워 매니지먼트 코드
- locking: 커널 동기화 관련 코드
- printk: 커널 콘솔 관련 코드
- trace: trace관련 코드
위 디렉터리들에는 아키텍처와 무관한 커널 공통 코드가 있으며, 아키텍처별로 동작하는 커널 코드는 arch/*kernel/에 있습니다.
-
mm: memory management의 약자로 가상 메모리 및 페이징 관련 코드가 들어 있습니다.
-
아키텍처별로 동작하는 메로리 관리 코드는 arch/*/mm 아래에 있습니다.
-
drivers: 모든 시스템의 디바이스 드라이버 코드가 있습니다. 하부 디렉터리에 드라이버 종류별 소스가 들어 있습니다.
-
fs: 모든 파일 시스템 코드가 담긴 폴더입니다.
-
lib: lib 디렉터리에는 커널에서 제공하는 라이브러리 코드가 있습니다. 아키텍처에 종속적인 라이브러리 코드는 arch/*/lib/에 있습니다.
-
-
주요 바이너리 유틸리티
- objdump: 라이브러리나 ELF 형식의 파일을 어셈블리어로 출력
- 헤더정보 확인: objectdump -x vmlinux
- 어셈블리 코드를 출력: objectdump -d vmlinux
- map파일을 열어보면, 심벌별 주소를 확인 가능.
- objdump --start-address=[시작주소] --stop-address=[끝주소] -d vmlinux
- as: 어셈블러
- ld: 링커
- addr2line: 주소를 파일과 라인으로 출력
- nm: 오브텍트 파일의 심벌을 출력
- readelf: ELF 파일의 내용을 출력