Linux驱动程序学习二 (续) scull 源码在内核5.4.0上的编译调试

如题所述

《LINUX设备驱动程序》第三章提供了源码scull,然而我使用的是内核版本5.4.0,与书中所提及的2.6.10内核存在较大的差异,导致编译scull源码时遇到诸多挑战。以下为具体的编译和调试记录,旨在为近期加入《LINUX设备驱动程序》学习的小白们提供参考。

一、main.c
1、在执行make命令时,出现以下两个错误提示。为了解决问题,直接在main.c中移除了这两个头文件,因为新版本内核已经废弃了它们。
2、对于copy_to_user与copy_from_user函数,新内核对这两个函数的命名进行了修改。根据错误提示,需要将代码进行相应调整。
3、access_ok函数在新内核中的参数从三个改为两个。根据错误提示,通过搜索函数调用的出处,找到了新的access_ok函数的参数格式为(ptr,len),并据此修改了代码。
4、对于ioctl函数,需要查看新内核中 ioctl 的具体实现。在/lib/modules/5.4.0/build/include/linux/fs.h中找到了新的 ioctl 函数原型,发现它已更改为 unlocked_ioctl,函数签名也有所改变。通过调整代码中的 ioctl 函数调用,确保了兼容性。
5、init_MUTEX函数在新内核中被弃用,替换为sema_init(&sem,1)。找到替换方法后,将main.c中的 init_MUTEX 更改为 sema_init,完成了问题解决。

二、pipe.c
1、同样在pipe.c中,init_MUTEX函数被替换为sema_init(&sem)。将此函数的调用从init_MUTEX修改为sema_init,确保了代码的正确性。
2、对于signal_pending函数,虽然函数参数没有变化,但发现它未包含在头文件/linux/sched/signal.h中。通过添加该头文件,解决了问题。

三、access.c
1、对于ioctl错误,参考了上一节中对ioctl函数的修改方法。
2、init_MUTEX问题通过将init_MUTEX修改为sema_init解决了。
3、SPIN_LOCK_UNLOCKED宏在新内核中被定义为DEFINESPINLOCK(x),因此需要在代码中进行相应的替换。
4、对于uid和euid的处理,新内核中uid和euid的定义已发生改变,位于/lib/modules/5.4.0/build/include/linux/cred.h的cred结构体中。因此在代码中将current->uid和current->euid替换为current->cred->uid和current->cred->euid。
5、结构体signal_struct的声明在头文件/lib/modules/5.4.0/build/include/linux/sched/signal.h中,确保在访问c中正确引用该结构体定义。

经过上述调试和修改,scull源码在内核版本5.4.0上成功编译通过,为后续学习和实践提供了良好的基础。通过这一过程,学习者不仅解决了实际问题,还深入了解了内核版本更新对驱动程序开发的影响,为后续深入学习LINUX设备驱动程序打下了坚实的基础。
温馨提示:内容为网友见解,仅供参考
无其他回答

Linux驱动程序学习二 (续) scull 源码在内核5.4.0上的编译调试
3、access_ok函数在新内核中的参数从三个改为两个。根据错误提示,通过搜索函数调用的出处,找到了新的access_ok函数的参数格式为(ptr,len),并据此修改了代码。4、对于ioctl函数,需要查看新内核中 ioctl 的具体实现。在\/lib\/modules\/5.4.0\/build\/include\/linux\/fs.h中找到了新的 ioctl 函数原型...

访问注册表出错
scull驱动的main.c第338行如下,就是使用printk进行调试的例子,这样的例子相信大家在阅读驱动源码时随处可见。 338 \/\/              printk(KERN_ALERT "wakeup by signal in process %d\\n", current-pid); printk的功能与我们经常在应用程序中使用的printf是一样的,不同之处在于printk可以...

...驱动程序。要求该字符设备包括scull_open() scull_write() scull_r...
1.4 函数scull_ioctl() #include <linux\/ioctl.h> #define SCULL_MAJOR 0 #define SCULL_MAGIC SCULL_MAJOR #define SCULL_RESET _IO(SCULL_MAGIC,0) \/\/ reset the data #define SCULL_QUERY_NEW_MSG _IO(SCULL_MAGIC,1) \/\/ check for new message #define SCULL_QUERY_MSG_LENGTH _IO(SCULL_MAGIC,2...

电脑驱动模块怎么设置电脑驱动器怎么安装
方法一:点击我的电脑——属性——硬件——设置管理器——点击对应的设备——右健属性——驱动程序——更新驱动程序进行安装。一步一步进行安装完成即可。C. 驱动如何调试驱动程序开发的一个重大难点就是不易调试。本文目的就是介绍驱动开发中常用的几种直接和间接的调试手段,它们是:1、利用printk2、查看OOP消息3、...

Unknown symbol __gnu_mcount_nc (err 0) insmod: can't insert 'te...
LDD(Linux Device Driver)第三章scull设备例子的时候,也遇到了相似的问题,后来发现是经make编译出来的scull.ko的owner和group属性不对,而一开始学习第二章hello world的时候却没有遇到这个问题,尝试着chown和chgrp之后(own和group都改成root),就能够顺利地用insmod加载该模块进内核了。

相似回答
大家正在搜