Cheatsheet for qemu
Debug Kernel
- Preparation, make sure you have already install these tools. Here, mine as follow:
- gdb 10.1-4
- qemu 5.2.0-3
- make 4.3-3
- binutil 2.36.1-2▫
- compile the kernel with debug configuration, we need three files here
- vmlinux (symbols)
- arch/x86-64-/boot/bzImage (kenel image in compressed format)
- scripts/gdb/vmlinux-gdb.py (gdb scripts)
- Lauch the emulator at src directory by excuting command▫
qemu-system-x86_64 -enable-kvm -S -s
-kernel ./arch/x86_64/boot/bzImage
-initrd ./rootfs.cpio.gz -nographic
-append 'nokaslr console=ttyS0'
--nographic
start without gui-S
will not run until connected with a gdb client-gdb tcp::[port]
run a gdbserver with open port at [port] by tcp
PS: -s
tells QEMU to start a GDB server on port 1234. -S
can be appended to pause the VM before starting to run.
- GDB debuger
gdb vmlinux
▫gdb: target remote :1234
lx-symbols
break start_kernel
orhb start_kernel
continute
BUGs FIX
- cannot insert breakpoints at 0xfffffffxxxxx
use nokaslr
or turn off KASLR while compile by set .config with CONFIG_RANDOMIZE_BASE = n
- qemu output(endless rebooting):
Booting from ROM...
Probing EDD (edd=off to disable)... ok
arly console in extract_kernel
input_data: 0x0000000002c773b4
input_len: 0x000000000090c470
output: 0x0000000001000000
output_len: 0x000000000173a968
kernel_total_size: 0x00000000025a7000
Decompressing Linux... Parsing ELF...
solution:
https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git/commit/?id=e3d03598e8ae7d195af5d3d049596dec336f569f
just add serval lines at arch/x86/Makefile 223
ifdef CONFIG_X86_64
LDFLAGS += $(call ld-option, -z max-page-size=0x200000)
endif ```