赞
踩
I 首先创建头文件driver_insmod源文件,并编写代码(需要源码可以私我):
书上代码有三个地方需要修改:
(1)头文件:
(2)主设备号要改成系统未使用的,如果不知道那些没有使用,可以执行vim arch/x86/entry/syscalls/syscall_64.tbl(32位系统选择32.tbl,64位系统选择64.tbl)该命令查看,那些未使用,我这里使用的是335
(3)filp->f_dentry->d_inode需要修改成file_inode(filp)
下面是报错:
编译并安装模块
Make
Sudo insmod driver_insmod.ko
可以看到生成的文件:
用lsmod查看安装的模块
执行ls /dev命令查看设备文件是否建立成功,可以看到myalloc就是所建立的设备文件。
II 测试驱动程序:
编写driver_test.c测试函数对内存设备进行测试(测试函数的源码需要可以私我),下面是编译过程:
测试运行过程:
步骤如下:
(1)首先在/usr/src/inux-5.12.9/drivers/ 目录下建立一个名称为 drivertest 的新目录,并 设计驱动源程序 driver_kernel.c, 为了方便,采用与18.3节相同的源程序(见上文18.3)。
(2)在新建的/usr/src/linux-5.12.9/drivers/drivertest目录下建立一个新的配置文件 Kconfig 和工程管理 Makefile 文件。
工程管理 Makefile 文件根据CONFIG_DRIVER_VMALLOC 宏来决定是否编译源文件, 并输出目标模块文件。脚本内容如下:
在 Kconfig 文件中,主要为内核配置提供选择开关;并定义 DRIVER_VMALLOC宏,作为是否包含myalloc驱动的选项。myalloc的配置文件 Kconfig 内容如下:
(3)把 myalloc设备驱动程序源文件 driver_kernel.c 放到新建的/usr/src/linux-5.12.9/ drivers/drivertest/目录下,使步骤(2)建立的 Kconfig 文件、Makefile 文件和源文件同在一目录下,如图所示。
(4)修改/usr/src/linux-5.12.9/drivers/Kconfig 文件,如图18.7所示,增加一行把 myalloc 配置作为驱动的一个选项,所添加的内容如下:
(5)修改/usr/src/linux-5.12.9/drivers/Makefile文件,在文件的最后,添加如下脚本:
这样使在编译 Linux 内核驱动时,能把 drivertest/ 目 录 包 含 进 去 。 这 里 , 使 用 了 宏 定 义 为 CONFIG_DRIVER_VMALLOC 判断是否包含。
(6)完成以上修改后,make menuconfig 重新配置内核,包括加载新设备myalloc,具体设置方法是:从 Device Drivers 中选择添加 myalloc设备,其中 Device drivers 目录
enter
enter
按Tap键选择*,后save->exit(添加新的设备)
退出后开始编译内核(若出现其他内核编译的问题见
Linux--内核编译流程+系统调用(ubuntu)-CSDN博客)
1.make bzImage
2.执行make install将其移动到boot路径下
3.接下来执行命令make modules来编译这些模块
4.最后执行命令make modules_install将内核模块安装到/lib/modules中
5.reboot重启
(7)检测 myalloc 驱动程序的安装。
系统重启动后进入系统,通过以下命令ls -l /dev 查看 myalloc 驱动程序安装结果:
(8)测试 myalloc 驱动程序的正确性。
编写Driver_test.c测试程序进行测试(该测试函数与18.3的测试函数一致,可见18.3),起初设备文件中没有内容,输出为空,第一次测试输入 Driver_kernel_testing,读Driver_kernel_testing。第二次测试输出 Driver kernel_testing, 为原始内容,输出 Driver_kernel_testing_ 1, 读取 Driver_kernel_testing_ 1, 说明驱动是正确的。
补充驱动加载编译可能遇到的问题:
1)cat /proc/devices //查看设备号
2)编译内核不出错但是测试运行error就有可能设备添加失败,建议模块案例18.3先调试一遍,通过后再进行内核编译。
3)注意可能需要把之前模块方式加载的驱动卸载掉。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。