원본 URL :

https://github.com/iamroot12CD/linux/wiki/raspberrypi2_kernel_debug

 

 

QEMU를 이용한 라즈베리파이2 커널 디버깅

QEMU 컴파일

$ mkdir -p ~/git/pi2
$ cd ~/git/pi2

$ git clone https://github.com/0xabu/qemu.git -b raspi
$ cd qemu
$ git submodule update --init dtc
  • QEMU 커널 BASE 주소 수정
    • Qemu 소스 hw/arm/boot.c 파일 수정.
#define KERNEL_LOAD_ADDR 0x00010000

이것을 아래처럼 수정.

#define KERNEL_LOAD_ADDR 0x00008000
  • compile 및 설치
$ cd ~/git/pi2/qemu

$ ./configure --target-list=arm-softmmu
$ make -j$(nproc)
$ sudo make install

라즈베리파이2용 커널 컴파일

$ mkdir ~/git/pi2
$ cd ~/git/pi2
$ git clone https://github.com/raspberrypi/tools
  • 컴파일 환경 설정 파일 만들기
$ vi env.sh
#!/bin/sh
export PATH=~/git/pi2/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin:$PATH
export KERNEL=kernel7

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
  • 환경 설정 적용.
$ source env.sh
  • 커널 컴파일시 추가 셋팅
$ cd ~/git/pi2/
$ git clone --depth=1 https://github.com/raspberrypi/linux
$ git checkout tag5  #  2016년 11월 이후 버전에서만 실행

$ cd linux
$ make bcm2709_defconfig
$ make menuconfig

Kernel hacking --> Compile-time checks and compiler option --> Compile the kernel with debug info --> Enable

$ make -j$(nproc) zImage modules dtbs

커널 디버깅

  • 컴파일 된 커널과 DTB파일 추출
$ scripts/mkknlimg arch/arm/boot/zImage ~/git/pi2/kernel7.img
$ cp arch/arm/boot/dts/bcm2709-rpi-2-b.dtb ~/git/pi2
  • QEMNU 실행 스크립트 작성.
$ vi ~/git/pi2/run_qemu.sh
#!/bin/sh

BOOT_CMDLINE="rw earlyprintk loglevel=8 console=ttyAMA0,115200 console=tty1 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2"
DTB_FILE="bcm2709-rpi-2-b.dtb"
KERNEL_IMG="kernel7.img"
SD_IMG="raspbian-jessie.img"

echo "target remote localhost:1234"
qemu-system-arm -s -S -M raspi2 -kernel ${KERNEL_IMG} \
    -sd ${SD_IMG} \
    -append "${BOOT_CMDLINE}" \
    -dtb ${DTB_FILE} -serial stdio
  • QEMU 실행
$ sh ./run_qemu.sh
  • gdb 실행 새터미널을 띄운후 gdb 실행(디버깅)
$ cd ~/git/pi2
$ source env.sh
$ cd ~/git/pi2/linux
$ arm-linux-gnueabihf-gdb ./vmlinux
# GDB shell에서 target remote localhost:1234 명령을 친다.
(gdb) target remote localhost:1234

# start_kernel 에 브레이크 포인트 셋팅
(gdb) b start_kernel

# 디버깅 시작.
(gdb) c

# 소스 확인
(gdb) list
493 vmalloc_init();
494 ioremap_huge_init();
495 }
496
497 asmlinkage __visible void __init start_kernel(void)
498 {
499 char *command_line;
500 char *after_dashes;
501
502 /*
(gdb)
번호 제목 글쓴이 날짜 조회 수
공지 [공지] 강좌, 팁, 정보등에 대해 올리는 게시판입니다. woos 2016.04.09 246
46 스터디 지역 관련 문의 [1] Tooson9010 2019.03.25 340
45 올해 스터디 모집기간 문의드립니다. [1] 니나노 2019.03.22 212
44 커널스터디 모집기간 [3] spinis 2019.02.22 609
43 안녕하세요 처음 가입합니다. 스터디는 어떤식으로 모집되는 건가요 [1] 이남호 2019.03.02 309
42 프로세스별 다른 ip 쓰기 [2] wizard1483 2017.09.03 5994
41 가상 머신 QEMU를 이용한 라즈베리파이2 커널 디버깅(업데이트) [2] 송원식 2017.05.22 1557
40 SW개발자를 위한 PaaS 서비스 무료 제공 안내 클라우드파스 2017.07.10 1069
» 가상 머신 QEMU를 이용한 라즈베리파이2 커널 디버깅 [2] 수풀 2016.08.08 2299
38 간단한 블럭장치 드라이버에 대한 강좌를 만들었습니다. [1] 김기오 2016.11.05 549
37 [무료세미나] 2016년 마우저 파워 컨퍼런스에 초대합니다. (마감임박) file 짜메롱 2016.11.24 291
36 U-BOOT관련 질문 입니다. 감기귤 2016.11.03 332
35 리눅스 커널 스터디 참고자료 (x86) [4] 리누즈박 2013.05.06 18393
34 SMP Booting에 관련해서 질문이 있습니다. [2] 컴퓨터 2016.06.15 387
33 작업하던 x86 분석 문서입니다. [9] file pororo 2014.06.26 4628
32 ion/dma-buf/dma_mapping_api 정리 문서 김기오 2014.05.19 2740
31 if문에 사용하는 likely와 unlikely 함수의 용도 [1] 아폴로 2014.03.05 11171
30 Pro Git 2장, 3장 요약입니다. 아폴로 2013.11.05 52078
29 리눅스 커널 코딩 스타일입니다. [1] 아폴로 2013.09.13 10146
28 책 집필 시 올바른 표현들 [5] file 조성진 2013.09.10 4169
XE Login