1. 리눅스 커널 디버깅

1. qemu 를 이용한 커널 디버깅

  • vmware와 같은 가상 머신
  • 리눅스 커널 디버깅
  • 앞으로 리눅스 프로세스 분석은 qemu 이용
  • 디바이스 드라이버 초반부

2. Buildroot 이용

  • 전체 시스템 빌드용

3. 스케줄러 디버깅

1. 커널 및 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 libxml2-utils xsltproc unzip php texinfo srecord libssl-dev

2. buildroot 다운로드 및 패치 적용

1. 다운로드

git clone https://github.com/raspberrypi/buildroot
cd buildroot
git reset 39a2ff16f92a61a3e8593c394d211c18d01de8d4 –hard

2. 패치 적용

  • 커널 버전 5.15 로 수정
git am 0001-kdt-RPI-5.15.patch
git am 0002-kdt-rpi-firmware-hash.patch

3. 빌드 설정

make raspberrypi4_64_defconfig

4. 커널 + rootfs 설정

make linux-menuconfig
make menuconfig

5 .빌드

make

3. qemu 설치, arm 64용 gdb 설치

sudo apt install qemu-system-aarch64
sudo apt install gdb-multiarch

4. qemu 리눅스 실행, gdb 연결 설정

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

5. 다른 터미널 창에서 gdb 또는 vscode 디버깅

6. qemu 사용법

1. ctrl +a,x

  • qemu 종료

2. ctrl + a,c

  • qemu mode와 OS mode 전환

3. info

  • 실행되고 있는 환경에서의 정보를 볼 수 있음
    -> info cpus: 실행되고 있는 cpu 정보

7. vscode로 디버깅

2. 최초 프로세스

  1. 전원을 켜면 부트로더(PC는 BIOS)에서 커널 진입 후 장치 초기화
  2. 리눅스 커널은 다음의 실행파일 을 최초 프로세스로 실행
    -> /sbin/init(case by system)

1. 최초 프로세스 생성(address space)

1. 격리를 위해서 리눅스는 자신만 동작한다는 환상을 갖게 해야됨

  • 환상을 만들기 위해 리눅스는 부팅 시 개인적인 메모리 주소 공간을 제공
  • 흔히 프로세스는 address space라는 것을 가장 처음 생성
  • 리눅스는 mm_struct + vm_area_struct + page_table을 통해 관리
  • arch/arm64/kernel/setup.c -> setup_arch()

2. 최초 프로세스 생성(커널 -> 유저 응용프로그램)

  • init/main.c -> rest_init()

3. 최초 시스템 콜(exec)

  • 위의 단계는 커널 단계에서 작동
  • 커널 모드에서 유저 모드로 진입을 해야 사용 가능함
  • 방법
    -> exec 시스템 콜을 활용
    -> exec를 이용해 새로운 파일 디스크립터와, 프로세스 메모리를 재구성
    -> 커널 부모 프로세스에는 영향을 미치지 않음
  • 위의 과정을 거쳐 init 프로세스(유저모드 단계) 생성
profile
Dev Ops, "Git, Linux, Docker, Kubernetes, ansible, " .

0개의 댓글

Powered by GraphCDN, the GraphQL CDN