- vmware와 같은 가상 머신
- 리눅스 커널 디버깅
- 앞으로 리눅스 프로세스 분석은 qemu 이용
- 디바이스 드라이버 초반부
- 전체 시스템 빌드용
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 libxml2-utils xsltproc unzip php texinfo srecord libssl-dev
git clone https://github.com/raspberrypi/buildroot cd buildroot git reset 39a2ff16f92a61a3e8593c394d211c18d01de8d4 –hard
- 커널 버전 5.15 로 수정
git am 0001-kdt-RPI-5.15.patch git am 0002-kdt-rpi-firmware-hash.patch
make raspberrypi4_64_defconfig
make linux-menuconfig make menuconfig
make
sudo apt install qemu-system-aarch64 sudo apt install gdb-multiarch
qemu-system-aarch64 -M raspi4 -machine virt -machine type=virt -cpu cortex-a72 -kernel output/build/linux-custom/arch/arm64/boot/Image -nographic -append "console=ttyAMA0 nokaslr" -m 512 -initrd output/images/rootfs.cpio -smp 1 -s -S
- qemu 종료
- qemu mode와 OS mode 전환
- 실행되고 있는 환경에서의 정보를 볼 수 있음
-> info cpus: 실행되고 있는 cpu 정보
- 전원을 켜면 부트로더(PC는 BIOS)에서 커널 진입 후 장치 초기화
- 리눅스 커널은 다음의 실행파일 을 최초 프로세스로 실행
-> /sbin/init(case by system)
- 환상을 만들기 위해 리눅스는 부팅 시 개인적인 메모리 주소 공간을 제공
- 흔히 프로세스는 address space라는 것을 가장 처음 생성
- 리눅스는 mm_struct + vm_area_struct + page_table을 통해 관리
- arch/arm64/kernel/setup.c -> setup_arch()
- init/main.c -> rest_init()
- 위의 단계는 커널 단계에서 작동
- 커널 모드에서 유저 모드로 진입을 해야 사용 가능함
- 방법
-> exec 시스템 콜을 활용
-> exec를 이용해 새로운 파일 디스크립터와, 프로세스 메모리를 재구성
-> 커널 부모 프로세스에는 영향을 미치지 않음- 위의 과정을 거쳐 init 프로세스(유저모드 단계) 생성