制作qemu虛拟機
看這裡如果是PC的話,就不用配置vnc了。
虛拟機配置完畢後要把
-enable-kvm
去掉再重新開機,不然軟體斷點不起作用。此外,加上
-s
以啟動gdbserver。
sudo qemu-system-x86_64 -m 4096 centos.img -net nic -net tap,ifname=tap0,script=no,downscript=no -s
關掉了kvm之後開機特别慢,我這要兩百多秒。
設定nokaslr
編譯核心子產品
Makefile裡加上
ccflags-y += -g -DDEBUG -O1
不能用
-O0
,可能會報錯。
配置gdb
在~/.gdbinit裡加上
add-auto-load-safe-path /full_path_to_kernel_build_dir/scripts/gdb/vmlinux-gdb.py
例如
add-auto-load-safe-path /mnt/hdd/kernel/gdb/linux-nova/scripts/gdb/vmlinux-gdb.py
這樣gdb裡就可以用
lx-symbols
了。
gdb連上qemu并設定自動加載子產品符号
cd
然後在gdb裡執行
target remote :1234
輸出:
0xffffffff827302c2 in native_safe_halt () at ./arch/x86/include/asm/irqflags.h:57
57 asm volatile("sti; hlt": : :"memory");
然後設定自動加載子產品符号,在gdb裡繼續執行:
lx-symbols path/to/parent/of/modules/
輸出:
loading vmlinux
scanning for modules in /home/searchstar/git/projects/nova/
scanning for modules in /mnt/hdd/kernel/gdb/linux-nova
loading @0xffffffffc1090000: /mnt/hdd/kernel/gdb/linux-nova/arch/x86/kernel/msr.ko
loading @0xffffffffc1088000: /mnt/hdd/kernel/gdb/linux-nova/net/netfilter/nft_fib_inet.ko
loading @0xffffffffc1080000: /mnt/hdd/kernel/gdb/linux-nova/net/ipv4/netfilter/nft_fib_ipv4.ko
此處省略若幹行
loading @0xffffffffc0000000: /mnt/hdd/kernel/gdb/linux-nova/fs/autofs/autofs4.ko
insmod
在gdb裡輸入c
(gdb) c
Continuing.
在gdb中設定斷點
(gdb) b nova_init_blockmap
Breakpoint 1 at 0xffffffffc10992ab: file /home/searchstar/git/projects/nova/balloc.c, line 212.
跑起來
(gdb) c
Continuing.
Breakpoint 1, nova_init_blockmap (sb=0xffff88809ee9cb08)
at /home/searchstar/git/projects/nova/balloc.c:212
212 {
(gdb) n
213 struct nova_sb_info *sbi = NOVA_SB(sb);
(gdb) n
214 unsigned long mask_bits = ceil_log_2(sbi->num_blocks);
(gdb) n
224 while (a * 5 < (1 << max_bits_a)) {