원본 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 130
42 가상 머신 QEMU를 이용한 라즈베리파이2 커널 디버깅(업데이트) [2] 송원식 2017.05.22 257
41 SW개발자를 위한 PaaS 서비스 무료 제공 안내 클라우드파스 2017.07.10 59
» 가상 머신 QEMU를 이용한 라즈베리파이2 커널 디버깅 [2] 수풀 2016.08.08 813
39 간단한 블럭장치 드라이버에 대한 강좌를 만들었습니다. [1] 김기오 2016.11.05 298
38 [무료세미나] 2016년 마우저 파워 컨퍼런스에 초대합니다. (마감임박) file 짜메롱 2016.11.24 211
37 U-BOOT관련 질문 입니다. 감기귤 2016.11.03 141
36 리눅스 커널 스터디 참고자료 (x86) [4] 리누즈박 2013.05.06 14450
35 SMP Booting에 관련해서 질문이 있습니다. [2] 컴퓨터 2016.06.15 203
34 VIM에서 CONFIG_ 설정 확인하기 [18] pororo 2013.07.18 7734
33 작업하던 x86 분석 문서입니다. [9] file pororo 2014.06.26 4443
32 ion/dma-buf/dma_mapping_api 정리 문서 김기오 2014.05.19 2583
31 if문에 사용하는 likely와 unlikely 함수의 용도 [1] 아폴로 2014.03.05 6796
30 Pro Git 2장, 3장 요약입니다. 아폴로 2013.11.05 4426
29 리눅스 커널 코딩 스타일입니다. [1] 아폴로 2013.09.13 9396
28 책 집필 시 올바른 표현들 [5] file 조성진 2013.09.10 4046
27 Bitwise Calculator 소개 [3] file K 2013.07.26 3325
26 IAMROOT.ORG 위키 plug-in 추가(update: 2013.11.22) [15] file 조성진 2013.07.14 5189
25 cscope.files 상대경로 문제 [5] 서한배 2013.07.03 6331
24 커널 분석용 vim 플러그인 설치하기 (Rev.4) [21] 리누즈박 2013.06.30 13380
XE Login