虚拟化(3):qemu+kernel 单步调试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中

#嵌入式##牛客创作赏金赛#
qemu+kernel 文章被收录于专栏

qemu+kernel

全部评论

相关推荐

03-19 09:58
河海大学 Java
最喜欢春天的奇亚籽很...:同学,是小红书不是小哄书,一眼就能看到的错误
投了多少份简历才上岸
点赞 评论 收藏
分享
01-30 22:03
门头沟学院 Java
用微笑面对困难:我滴妈,【俩月】【实习】【主管】仨debuff吃满了,独立设计开发的项目写了绝大占比的运营板块,你独立开发,那维护、问题复盘、日志更新、bug、策划书全是自己整的? 不建议写那么大,可以从小出发更容易
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务