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,星网,航空工业上电所 接下来会分享一些面试经验和学习经验

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务