앞에서 작성된 글이 커널 버젼이 변경되어서 정상동작 하지 않는것 같아서 현재까지 확인한 사항 업데이트해서 문서를 만들었습니다.

내용은 앞쪽 글과 동일하며 단지 커널소스를 가져오는 부분 정도만 업데이트 했습니다.

 

-분석내용

인터넷에 확인해 보면 마지막으로 QEMU 에뮬레이션 되었던 kernel version이 2015년 11월 버젼인것 같습니다.

최선 커널 버젼으로 하면 emmc, rng driver가 정상적으로 에뮬레이션 되지 않아서 문제가 발생하는것 같습니다

kernel source를  2015년 11월 버젼(tag5)가져와서 사용하면 정상동작 합니다.

 

원본 URL :

http://www.iamroot.org/xe/index.php?mid=Knowledge&document_srl=179241

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 https://github.com/raspberrypi/linux
$ cd linux
$ git checkout tag5

$ make bcm2709_defconfig
$ make menuconfig

Kernel hacking --> Compile-time checks and compiler option --> 
            Compile the kernel with debug info --> Enable
            Generate dwarf4 debuginfo --> Enable
            Provide GDB scripts for kernel debuffing--> 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
$ ddd --debugger arm-linux-gnueabihf-gdb ./vmlinux
# GDB shell에서 target remote localhost:1234 명령을 친다.
(gdb) target remote localhost:1234

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

# 디버깅 시작.
(gdb) c

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 강좌, 팁, 정보등에 대해 올리는 게시판입니다. 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
» 가상 머신 QEMU를 이용한 라즈베리파이2 커널 디버깅(업데이트) [2] 송원식 2017.05.22 1557
40 SW개발자를 위한 PaaS 서비스 무료 제공 안내 클라우드파스 2017.07.10 1069
39 가상 머신 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