qemu+kernel (3) 单步调试arm64 linux driver
pre:
kernel:6.6(upstream)并且已经提前编译defconfig以及make kernel, 参考前面的内容
1.编译ko
指定目录编译,会快一些,创建一个目录,可以放在杂项驱动下面
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- M=drivers/misc/mydriver modules -j8 linux/drivers/misc/mydriver$ ls -l total 92 -rw-r----- 1 liuxin users 195 May 19 15:30 Makefile -rw-r----- 1 liuxin users 11 May 19 15:31 modules.order -rw-r----- 1 liuxin users 0 May 19 15:31 Module.symvers -rw-r----- 1 liuxin users 1370 May 19 15:21 mydriver.c -rw-r----- 1 liuxin users 37920 May 19 15:31 mydriver.ko -rw-r----- 1 liuxin users 13 May 19 15:31 mydriver.mod -rw-r----- 1 liuxin users 426 May 19 15:31 mydriver.mod.c -rw-r----- 1 liuxin users 13160 May 19 15:31 mydriver.mod.o -rw-r----- 1 liuxin users 16112 May 19 15:31 mydriver.o
Makefile代码
obj-m += mydriver.o KDIR := <kernel代码所在目录> PWD := $(shell pwd) EXTRA_CFLAGS += -g all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: $(MAKE) -C $(KDIR) M=$(PWD) clean
编译完成后将ko放到rootfs中
sudo mount rootfs.img rootfs sudo mkdir rootfs/driver sudo cp ../hello_driver.ko rootfs/driver/ sudo umount rootfs
2.加载ko
insmod mydriver.ko 加载驱动
rmmod mydriver.ko 卸载驱动
此时并无法观察全局变量和ko里的函数
(gdb) p global_hello_value No symbol "global_hello_value" in current context. (gdb) b test_for_debug Function "test_for_debug" not defined. Make breakpoint pending on future shared library load? (y or [n]) n
3.调试ko
(1) insmod ko之后可以查看ko加载地址
图中可以看到,sections里面就是各种地址
Ctrl+c可以暂停continuing
(2)第一个问题,ko里的变量看不到。
解决:加载.data地址
开gdb的目录建议放在linux的根目录
(3)第二个问题,ko里的test_for_debug
解决:加载.data的地址
此时我们
就会触发ko的open和read函数,但是ko只写了open,就会调用open,然后执行test_for_debug
如果想debug初始化的部分,就需要添加下面的内容到gdb中
嵌入式软件面试经验及学习经验 文章被收录于专栏
秋招之旅结束大半,目前也拿到了一些公司的offer,各种方向的: 芯片公司:兆芯,联发科,大普微等 产品公司:小米,联想,影石,虹软,诺瓦等 汽车公司:长安,博世,经纬恒润等 国央企研究所:32所,52所,712,星网,航空工业上电所 接下来会分享一些面试经验和学习经验