리눅스 커널 패치와 커널(한빛미디어)를 보고 공부하던 중 버전차이로 인한 문제점이 있어 해결하는 과정을 기록했습니다. (질문에 답해주신 ultract2 님 감사드립니다.)
현재 문제가 되는 부분은 qemu와 gdb를 연동시킨 후 gdb에서 break를 걸어도 멈추지 않고 커널 부팅이 진행되는 문제점이 발생하였고, 이 부분만 언급하도록하겠습니다. 나머지는 책을 참고하시면되겠습니다.
날짜 2018-07-11
Ubuntu 16.04
커널
개발용 커널 버전 : 4.18
커널 개발 툴 설치
$sudo apt-get install build-essential kernel-package libncurses5 libncurses5-dev libssl-dev bison flex
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
$git fetch
$git checkout
(여기서는 개발용 커널 버전이므로 이하 디렉토리는 linux-next 사용)
컴파일
$cd ~/Kernel/
$make
Kernel hacking ---> Compile-time checks and compiler options ---> Compile the kernel with debug info 체크
Kernel hacking ---> Choose kernel unwinder ---> Frame pointer unwinder 체크
환경 설정에서 제일 문제가 됐던 부분입니다.
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 (-
$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는 apt-get으로 간단히 설치
$sudo apt-get install qemu qemu-system
gdb는 소스코드 수정이 필요함
$sudo apt-get install
$cd ~
$git clone git://sourceware.org/git/binutils-gdb.git
$cd binutils-
$vim
http://www.cygwin.com/ml/gdb-patches/2012-03/msg00116.html 참고해서 수정
(버전이 업데이트되면서 일부 내용이 바뀌었으나 코드 기본 흐름은 동일, 특히 MAX_REMOTE_PACKET_SIZE 상수는 버전이 오르면서 최신 버전에는 없는 상수이므로 16384로 설정)
$
$make
$sudo make install
(2개 터미널 필요)
터미널 1
$cd ~/Kernel/
$qemu -s -S -no-
터미널 2
$cd ~/Kernel/
$gdb
(
(
(
이렇게 진행하시면 start_kernel에서 중단되는것을 확인하실수 있습니다.
P.S. kernel 문서에 포함되어있다는데... 진작 문서부터 읽어볼껄...
'공부 > 커널' 카테고리의 다른 글
[프로젝트] 커널레벨 DSM (0) | 2017.06.29 |
---|---|
커널 소스 분석 1. system call trace (2) | 2016.01.09 |
asmlinkage에 대해 (0) | 2014.09.02 |