본문 바로가기

공부/커널

qemu + gdb 연동

728x90

리눅스 커널 패치와 커널(한빛미디어)를 보고 공부하던 중 버전차이로 인한 문제점이 있어 해결하는 과정을 기록했습니다. (질문에 답해주신 ultract2 님 감사드립니다.)

현재 문제가 되는 부분은 qemu와 gdb를 연동시킨 후 gdb에서 break를 걸어도 멈추지 않고 커널 부팅이 진행되는 문제점이 발생하였고, 이 부분만 언급하도록하겠습니다. 나머지는 책을 참고하시면되겠습니다.


날짜 2018-07-11


Ubuntu 16.04

커널 : Kernel 4.10

개발용 커널 버전 : 4.18 


커널 개발 툴 설치

$sudo apt-get install build-essential kernel-package libncurses5 libncurses5-dev libssl-dev bison flex libelf-dev


Git 설치

$sudo apt-get install git


소스 다운로드

$cd ~

$mkdir Kernel

$cd Kernel

커널 최신판을 다운받을경우

$git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux

개발용 커널을 다운받을 경우

$git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next

개발용 커널을 패치 받을 경우

$git remote add linux-next https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next

$git fetch linux-next

$git checkout linux-next


(여기서는 개발용 커널 버전이므로 이하 디렉토리는 linux-next 사용)

컴파일

$cd ~/Kernel/linux-next

$make menuconfig

Kernel hacking ---> Compile-time checks and compiler options ---> Compile the kernel with debug info 체크(기본으로 되어있음)

Kernel hacking ---> Choose kernel unwinder ---> Frame pointer unwinder 체크


Process type and features ---> Randomize the address of the kernel image(KASLR) 체크 해제

환경 설정에서 제일 문제가 됐던 부분입니다. 

gdb에서 중단점을 걸고 커널을 실행할 경우 Continuing 이라는 메시지만 나올뿐 진행이 되지 않아 아무 반응이 없는것으로 생각할 수 있는데, 오히려 중단점에 걸리지 않고 실행되는것이 문제입니다.


처음엔 gdb의 연결문제로 생각해 접근했었는데 딱히 문제점은 못찾았고 검색하던 중 중단점을 건너뛰는 사람 발견

그리고 커널 부팅에서 메시지를 뿌리고있으니 당연히 start_kernel이 실행되는것이였고...

https://unix.stackexchange.com/questions/396013/hardware-breakpoint-in-gdb-qemu-missing-start-kernel


"nokaslr" 라는 키워드가 보이고 menuconfig에서 KASLR 옵션을 끄라고합니다.

구글링을 해보니

https://z49x2vmq.github.io/2018/01/14/kaslr/

친절하신 분께서 정리를..


make를 이용할 경우

$make (-jx x는 작업 수)

$make modules

$sudo make modules_install

$sudo make install


make-kpkg를 이용할 경우

$make-kpkg --initrd (-jx x는 작업수) kernel_image kernel_headers kernel_source modules_image


qemu & gdb 설치

qemu는 apt-get으로 간단히 설치


$sudo apt-get install qemu qemu-system


gdb는 소스코드 수정이 필요함

$sudo apt-get install texinfo

$cd ~

$git clone git://sourceware.org/git/binutils-gdb.git

$cd binutils-gdb

$vim ./gdb/remote.c

http://www.cygwin.com/ml/gdb-patches/2012-03/msg00116.html 참고해서 수정

(버전이 업데이트되면서 일부 내용이 바뀌었으나 코드 기본 흐름은 동일, 특히 MAX_REMOTE_PACKET_SIZE 상수는 버전이 오르면서 최신 버전에는 없는 상수이므로 16384로 설정)


$./configure

$make

$sudo make install


qemu + gdb 실행

(2개 터미널 필요)

터미널 1

$cd ~/Kernel/linux-next

$qemu -s -S -no-kvm -kernel arch/x86/boot/bzImage -hda /dev/zero -append "root=/dev/zero console=ttyS0" -serial stdio -display none


터미널 2

$cd ~/Kernel/linux-next

$gdb ./vmlinux

(gdb) target remote localhost:1234 (혹은 그냥 :1234)

(gdb) b start_kernel

(gdb) c or continue


이렇게 진행하시면 start_kernel에서 중단되는것을 확인하실수 있습니다.

P.S. kernel 문서에 포함되어있다는데... 진작 문서부터 읽어볼껄...







'공부 > 커널' 카테고리의 다른 글

[프로젝트] 커널레벨 DSM  (0) 2017.06.29
커널 소스 분석 1. system call trace  (2) 2016.01.09
asmlinkage에 대해  (0) 2014.09.02