리눅스 커널을 디버깅할 수 있는 환경을 구축하여 디바이스 드라이버나 리눅스 커널을 분석할 수 있도록 만든다.
그 후, init 프로세스가 어떻게 생성이 되는지, 제일 처음 사용되는 시스템 콜이 무엇인지 분석할 것이다.
Buildroot
qemu
JTAG 장비가 없으므로, qemu를 이용해 리눅스 커널을 디버깅할 것이다.
qemu는 vmware와 같은 가상 머신이다.
Buildroot
임베디드 시스템 오픈 소스 프로젝트로, 리눅스 커널과 파일시스템을 구축할 때 전체 시스템 빌드용으로 사용한다.
환경 구축 과정
- 패키지 설치
- 소스 코드 다운로드 및 패치
- 커널 및 rootfs 빌드 설정
- 커널 및 rootfs 빌드 (오래 걸림..)
패키지 설치
우선, 스케줄러 디버깅을 위해, buildroot를 빌드하기 위해 패키지를 설치해야 한다.
$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib lib32ncurses5-dev x11proto-core-dev libx11-dev libgl1-mesa-dev
Buildroot 다운 및 패치 적용
# buildroot 다운
$ git clone https://github.com/raspberrypi/buildroot
# 특정 브랜치로 이동
$ cd buildroot
$ git reset 39a2ff16f92a61a3e8593c394d211c18d01de8d4 --hard
# 다운로드 받은 패치 적용 (커널 버전을 5.15로 수정)
$ cp ~/Downloads/0001-kdt-RPI-5.15.patch ./
$ git am 0001-kdt-RPI-5.15.patch
커널 설정
buildroot에는 raspberrypi4 64bit용 설정값이 있는데, 그 값을 설정해 준다.
$ make raspberrypi4_64_defconfig
Device별 설정값들은 configs 디렉터리에서 확인할 수 있다. 각자 디바이스에 맞는 config를 설정해 주면 된다.
$ cd ~/buildroot/configs
$ ls
커널 디버깅 정보 추가
리눅스 커널의 디버깅 정보는 들어가 있지 않기 때문에 추가를 해주어야 한다. (처음에 되게 오래 걸린다...)
$ make linux-menuconfig
linux-menuconfig는 리눅스 커널 소스 코드의 설정을 세팅하는 Kconfig와 menuconfig를 결합한 것이다.
- Kconfig : 리눅스 커널 소스 코드의 옵션들을 구성하고 관리하는 도구
- menuconfig는 터미널 기반의 인터페이스를 제공하여 설정 메뉴를 편집할 수 있다.
linux-menuconfig를 make 하면, 현재 Buildroot 프로젝트에서 사용 중인 리눅스 커널 소스 코드의 설정 메뉴가 뜬다.
여기에서 리눅스 커널의 다양한 기능과 옵션을 설정해 줄 수 있다.
Kernel hacking → Compile-time checks and comiler option → Compile the kernel with debug info를 선택한다.
저장 후 종료
rootfs 설정 (buildroot 설정)
$ make menuconfig
Filesystem images → cpio the root filesystem 선택
이 옵션은 RAM 파일 시스템으로 사용하기 위해 루트 파일 시스템을 CPIO 형식으로 패키징 하는 기능이다.
RAM 파일 시스템은 시스템 부팅 시 임시로 사용되는 파일 시스템으로, 커널이 메인 루트 파일 시스템을 마운트 하기 전에 사용된다.
부팅 과정에서 필요한 초기화 작업이나 장치 라이버 로딩, 설정 파일 등을 로딩한다.
커널 & rootfs 빌드
$ make
빌드가 완료되면 output/images 디렉터리에 image들이 생긴다.
- Image : 커널 이미지
- bcm2711-rpi-4-b.dtb : 커널이 사용하는 디바이스에 의존하는 설정 값이 들어있는 데이터
- rootfs.cpio : 램 디스크를 위한 cpio
- sdcard.img : 커널과 루트파일 시스템을 가지고 라즈베리파이가 부팅할 이미지