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

LINUX设备驱动程序》第三章提供了源码scull,但是由于我用的是5.4.0内核,书中的是2.6.10内核,内核发生了很大的变化,因此编译scull源码花费了不少时间,下面是编译调试记录。(这个编译调试记录应该是目前网络上适应内核版本最高的,所以也希望给近期加入《LINUX设备驱动程序》学习的小白们一个参考)。

一、main.c

1、make出现以下两个错误:

/home/valian/scull/main.c:17:26: fatal error: linux/config.h: 没有那个文件或目录
/home/valian/scull/main.c:32:46: fatal error: asm/system.h: 没有那个文件或目录

直接在main.c中删除这两个头文件.在新的内核里弃用了这两个.

2、copy_to_user copy_from_user

/home/valian/scull/main.c:324:6: error: implicit declaration of function ‘copy_to_user’ [-Werror=implicit-function-declaration]if (copy_to_user(buf, dptr->data[s_pos] + q_pos, count)) {^
/home/valian/scull/main.c: In function ‘scull_write’:
/home/valian/scull/main.c:373:6: error: implicit declaration of function ‘copy_from_user’ [-Werror=implicit-function-declaration]if (copy_from_user(dptr->data[s_pos]+q_pos, buf, count)) {

新内核修改了这两个函数名称,更改如下:

copy_to_user()改为raw_copy_to_user();
copy_from_user()改为raw_copy_from_user();

3、access_ok

 /home/valian/scull/main.c:414:68: error: macro "access_ok" passed 3 arguments, but takes just 2err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));^
/home/valian/scull/main.c:414:10: error: ‘access_ok’ undeclared (first use in this function)err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));^
/home/valian/scull/main.c:414:10: note: each undeclared identifier is reported only once for each function it appears in
/home/valian/scull/main.c:416:68: error: macro "access_ok" passed 3 arguments, but takes just 2err =  !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));

从错误提示看,大概是新内核的access_ok的参数为2个,但是原来内核为3个。

通过以下指令在源码中查找access的出出处:

find /lib/modules/5.4.0/build/include/linux  -type f -exec grep "access_ok" {} ; -print

得到以下提示:

v2-fc365addd71540922bbb2ef38d57f74c_b.png

从提示看到新的access_ok的参数为(ptr,len),于是修改代码如下:

err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
err =  !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
改为err = !access_ok((void __user *)arg, _IOC_SIZE(cmd));

4 、.ioctl (可参考CSDN-专业IT技术社区-登录)

make -C /lib/modules/5.4.0/build M=/home/valian/scull LDDINC=/home/valian/scull/../include modules
make[1]: Entering directory '/usr/src/linux-5.4'CC [M]  /home/valian/scull/main.o
/home/valian/scull/main.c:558:2: error: unknown field ‘ioctl’ specified in initializer.ioctl =    scull_ioctl,^
/home/valian/scull/main.c:558:14: error: positional initialization of field in ‘struct’ declared with ‘designated_init’ attribute [-Werror=designated-init].ioctl =    scull_ioctl,

ioctl是未知域,同样检索ioctl

find /lib/modules/5.4.0/build/include/linux  -type f -exec grep "ioctl" {} ; -print

得到(在/lib/modules/5.4.0/build/include/linux/fs.h)

v2-a929ab6a8648c42b3f7f933e508c3aa1_b.jpg
	long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);   // 5.4.0int (*ioctl)(struct inode *, struct file *, unsigned int, unsigned long);    // 2.6.10 网络上查找

对比发现.ioctl变为.unlocked_ioctl,函数指针的原型也变了,少了struct inode * 这个指针参数,而且函数类型也由int变为long。修改如下;

.ioctl = scull_ioctl改为 .unlocked_ioctl = scull_ioctl;

函数scull_ioctl改为(main.c 和scull.h)

long scull_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);  // int 改为long,struct inode* 删除   

5、init_MUTEX

/home/valian/scull/main.c: In function ‘scull_init_module’:
/home/valian/scull/main.c:653:3: error: implicit declaration of function ‘init_MUTEX’ [-Werror=implicit-function-declaration]init_MUTEX(&scull_devices[i].sem);


通过以下命令

find /lib/modules/5.4.0/build/include/linux  -type f -exec grep "init_MUTEX" {} ; -print 

查找,结果没有找到,应该是这个函数名称被弃用。在网络中找到解决方法init_MUTEX(&sem)被sema_init(&sem,1)替换了。

init_MUTEX(&scull_devices[i].sem);     改为sema_init((&scull_devices[i].sem),1);

sema_init的定义可参考/lib/modules/5.4.0/build/include/linux/semaphore.h

static inline void sema_init(struct semaphore *sem, int val)

pipe.c

1:init_MUTEX

同main.c,init_MUTEX改为sema_init;

//init_MUTEX(&scull_p_devices[i].sem);
sema_init((&scull_p_devices[i].sem),1);

2、signal_pending

/home/valian/scull/pipe.c: In function ‘scull_getwritespace’:
/home/valian/scull/pipe.c:172:7: error: implicit declaration of function ‘signal_pending’ [-Werror=implicit-function-declaration]if (signal_pending(current))

从错误代码查找关键词signal_pending的定义:

查找命令

find /lib/modules/5.4.0/build/include/linux -name '*.h' | xargs grep -w "signal_pending"

得到如下信息:

valian@valian-TM1703:~/scull$ find /lib/modules/5.4.0/build/include/linux -name '*.h' | xargs grep -w "signal_pending"
/lib/modules/5.4.0/build/include/linux/sched/signal.h:static inline int signal_pending(struct task_struct *p)

从signal_pending定义看函数参数没有改变,但是没有包含/linux/sched/signal.h头文件。

加上头文件:

#include <linux/sched/signal.h>

access.c

1、.ioctl 错误,参考上面的改正方法。

2、init_MUTEX

init_MUTEX(&(lptr->device.sem));改为sema_init(&(lptr->device.sem),1);

3、SPIN_LOCK_UNLOCKED

/home/valian/scull/access.c:98:34: error: ‘SPIN_LOCK_UNLOCKED’ undeclared here (not in a function)static spinlock_t scull_u_lock = SPIN_LOCK_UNLOCKED;

从提示看没有定义。查找关键词

find /lib/modules/5.4.0/build/include/linux  -type f -exec grep "SPIN_LOCK_UNLOCKED" {} ; -print 

得到以下信息

#define DEFINE_SPINLOCK(x)	spinlock_t x = __SPIN_LOCK_UNLOCKED(x)
/lib/modules/5.4.0/build/include/linux/spinlock_types.h

根据以上信息与源码中“static spinlock_t scull_u_lock = SPIN_LOCK_UNLOCKED;”对比发现,宏定义 DEFINESPINLOCK(x) 代替了源码中spinlock_t scull_u_lock = SPIN_LOCK_UNLOCKED。因此按以下修改即可。

//static spinlock_t scull_u_lock = SPIN_LOCK_UNLOCKED;
//static spinlock_t scull_c_lock = SPIN_LOCK_UNLOCKED;
//static spinlock_t scull_w_lock = SPIN_LOCK_UNLOCKED;static  DEFINE_SPINLOCK(scull_u_lock) ;static  DEFINE_SPINLOCK(scull_c_lock) ;static  DEFINE_SPINLOCK(scull_w_lock) ;

4、uid euid

/home/valian/scull/access.c:108:29: error: ‘struct task_struct’ has no member named ‘uid’(scull_u_owner != current->uid) &&  /* allow user */^
/home/valian/scull/access.c:109:29: error: ‘struct task_struct’ has no member named ‘euid’(scull_u_owner != current->euid) && /* allow whoever did su */

查找关键词struct task_struct

find /lib/modules/5.4.0/build/include/linux  -type f -exec grep "struct task_struct" {} ; -print

众多信息中找到定义在/lib/modules/5.4.0/build/include/linux/sched.h

struct task_struct {
...........
}
/lib/modules/5.4.0/build/include/linux/sched.h

但是查找sched.h中struct task_struct的定义,没有找到“uid,euid”。网络搜寻得知新的struct taskstruct 定义有变化,uid和euid在cred结构体中(在头文件/lib/modules/5.4.0/build/include/linux/cred.h中)。如下图找到uid,euid,其类型为kuid_t

v2-ca795039f75c7949517d4ee8ffe3898f_b.jpg

在</lib/modules/5.4.0/build/include/linux/uidgid.h>中查到kuid_t为结构体类型,定义如下:

typedef struct {uid_t val;
} kuid_t;

access.c中scull_u_owner的类型为static uid_t scull_u_owner。因此需要修改代码如下:

(current->uid改为current->cred->uid,current->euid改为current->cred->euid)

//scull_w_owner == current->uid ||
//scull_w_owner == current->euid ||
改为
scull_w_owner == current->cred->uid.val ||
scull_w_owner == current->cred->euid.val ||//			(scull_u_owner != current->uid) &&  /* allow user */
//			(scull_u_owner != current->euid) && /* allow whoever did su */
改为(scull_u_owner != current->cred->uid.val) &&  /* allow user */(scull_u_owner != current->cred->euid.val) && /* allow whoever did su */

过程中出现以下错误可参考[PATCH 0/5] PMFS: Rebase to Linux 3.9

/home/valian/SLAM/linux/scull/access.c:115:19: error: invalid operands to binary != (have ‘uid_t {aka unsigned int}’ and ‘kuid_t {aka const struct <anonymous>}’)(scull_u_owner != current->cred->uid) &&  /* allow user */^
/home/valian/SLAM/linux/scull/access.c:116:19: error: invalid operands to binary != (have ‘uid_t {aka unsigned int}’ and ‘kuid_t {aka const struct <anonymous>}’)(scull_u_owner != current->cred->euid) && /* allow whoever did su */       

5、struct signal_struct

/home/valian/SLAM/linux/scull/access.c:283:22: error: dereferencing pointer to incomplete type ‘struct signal_struct’if (!current->signal->tty) { 

错误提示可能是没有声明对应结构体定义的头文件。查找struct signal_struct的定义:

find /lib/modules/5.4.0/build/include/linux  -type f -exec grep "struct signal_struct" {} ; -print

得到以下结果,在/lib/modules/5.4.0/build/include/linux/sched/signal.h。

struct signal_struct {
static inline void signal_set_stop_flags(struct signal_struct *sig,
static inline int signal_group_exit(const struct signal_struct *sig)
/lib/modules/5.4.0/build/include/linux/sched/signal.h

在assess.c中加上头文件;

#include  <linux/sched/signal.h>

至此scull源码在内核linux5.4.0上编译通过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android评论嵌套,android 嵌套的listview示例(可参照实现朋友圈评论)

android 嵌套的listview示例(可参考实现朋友圈评论) 最近在项目中用到listview中再嵌套一个listview&#xff0c;两层也有监听&#xff0c;都没有问题。其实&#xff0c;主要解决里面那一层的listview的高度计算就可以&#xff0c;外面那一层listview自动计算。加上里面那层展开…

捷达vs7测试_捷达VS5话题:防撞钢梁,溃缩梁。第200311期

//封面图&#xff0c;捷达VS5&#xff0c;自中&#xff0c;最近看到网上有些观点有点儿带偏&#xff0c;然后咱们技术群今天也讨论了一下&#xff0c;大家也来听听咱们爱折腾的车主们是怎么看防撞梁的事情的。事情起因是因为大家看到一些网上的拆车视频&#xff0c;说捷达VS5前…

html5 原生拖拽,原生JS实现拖拽效果

这篇文章主要为大家详细介绍了原生JS实现拖拽效果&#xff0c;文中示例代码介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下本文实例为大家分享了JS实现拖拽效果的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下想要让整个元…

ov5640帧率配置_逃离塔科夫怎么提升帧率 帧率优化建议_单机游戏_游戏攻略

逃离塔科夫有着非常真实的游玩与画面表现&#xff0c;所以这类的多人游戏比较吃配置&#xff0c;那么帧率上不去会十分影响游戏体验&#xff0c;下面请看由“SIIYAM”带来的逃离塔科夫帧率优化建议&#xff0c;一起来看看吧。帧率优化建议&#xff1a;这游戏对于cpu资源分配和内…

js 带笔锋 签字版_年轻人的第一支签字笔? ——米家签字笔评测

emm感觉笔者能咕到自己都怀疑人生惹QAQ…对于小米而言&#xff0c;可能他家中性笔做的还真没手机那么好。但对于劝退这件事&#xff0c;理由其实是很复杂的。但既然决定了要来写这样一点东西&#xff0c;那我也自然要把我知道的和能想到的&#xff0c;略述一二。我们先来看看小…

itools 不支持缩略图下载_PS插件缩略图3.8.0.96安装教程

插件下载[名称]&#xff1a;PS插件『缩略图补丁3.8.0.96』[大小]&#xff1a;1.4 MB [语言]&#xff1a;简体中文 [安装环境]&#xff1a;Win7/Win8/Win10[支持版本]&#xff1a;PS CS6—CC2019[32/64位下载链接]&#xff1a;https://pan.baidu.com/s/1AlOlWzMZfYgdJSlZpbQsmw…

z370支持pcie信号拆分吗_定了!AMD B550主板确认将支持PCIE4.0,多项能力接近X570

近日&#xff0c;华擎B550AM Gaming主板照片和文档泄露&#xff0c;Micro-ATX板型、具备4内存插槽&#xff0c;支持PCIE4.0显卡/固态硬盘。B550芯片组本身无法拆分PCIE4.0信道&#xff0c;所以华擎的这张B550主板在搭配第三代锐龙时只有第一条PCIE插槽(通常安装独立显卡)和M.2固…

mac 修改conda镜像 condarc_win10 修改anaconda源

通过 conda config 命令生成配置文件&#xff0c;这里&#xff0c;我们使用清华的镜像&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/&#xff0c;首先&#xff0c;打开CMD&#xff0c;执行命令&#xff1a;conda config --add channels https://mirro…

倒计时css和js html代码,手把手教你利用CSS和JS创建一个倒数计时器

倒计时功能&#xff0c;在很多地方都会用到&#xff0c;我们平时都习惯去用一些插件来应用&#xff0c;会减少不少的工作量&#xff0c;并且效果也能达到预期。我今天并不是想分享什么倒计时插件&#xff0c;而是自己写一个简单的倒数计时器&#xff0c;有兴趣的同学可以往下看…

手机端使用ghelper_Anki手机端使用指南(一)

【本篇会对如何使用手机端anki进行详解】有小伙伴询问在应用商店搜索anki找不到名字叫“anki”的软件&#xff0c;这里解释一下&#xff0c;在手机端的名字和电脑端的名字不太一样。安卓对应的名字叫做AnkiDroidIOS对应的名字叫做Ankimobile不过其实是一个软件&#xff0c;同步…

三甲医院his系统源码_三甲医院科研管理系统是什么,科研成果包括哪些

对于三甲医院来说&#xff0c;做科研管理系统必不可少的是数据收集&#xff0c;有一个方便的数据收集管理软件能记科研效率提高很多&#xff0c;那就是三甲医院科研管理系统&#xff0c;首先&#xff0c;我们先了解一下三甲医院科研管理系统是什么&#xff0c;科研成果包括哪些…

html的表格使用函数,从另一个HTML表格创建HTML表格的jQuery函数

我在页面上有一个HTML表格&#xff0c;我想用jQuery从中获取信息&#xff0c;清理/清理它&#xff0c;并创建一个新的“干净的”HTML表格信息。从另一个HTML表格创建HTML表格的jQuery函数我有表具有以下结构&#xff1a;Full Name123.456.7890456.789.0123OfficeTitleSuperviso…

git 创建邮箱 用户名_厉害了!IDEA中如何使用Git进行项目管理,完整教程来了?...

第一部分:安装1. 下载地址: https://git-scm.com/download/win如果速度慢, 使用 迅雷下载;2. 点击安装, 然后下一步, 直到下面这个页面:建议: 按照上面所示方式选中复选框 ;3. 点击下一步, 直到出现这个页面:建议: 这个页面是选择git使用的命令行, 建议使用第一个git自带的;4. …

程序员操作系统推荐_为什么程序员要会 Linux

(给伯乐在线加星标&#xff0c;看经典文章)作者&#xff1a;猫嗅花https://www.jianshu.com/p/5020fbd76d0c三大操作系统概述三大操作系统概述windows, macOS, linux是当今主流三大操作系统&#xff0c;普通用户一般是选择windows或macOS, linux主要是占据服务器领域市场。这三…

url中能出现的字符_网站URL配置4个技巧,轻松获得更多流量

对于刚入行的SEO新人&#xff0c;我们在做企业网站优化的时候&#xff0c;通常都是按照程序员设置的网站架构进行线上基础性内容的优化&#xff0c;特别是在使用一些固定CMS系统的时候&#xff0c;大量的站内URL都是配置固定的&#xff0c;很少有人去关注这方面对SEO的影响。那…

怎么修剪_幸福树怎么修剪——武汉花卉租摆

幸福树&#xff0c;一种寓意美好的观赏型植物&#xff0c;它生长非常迅速&#xff0c;稍不注意就长的非常茂盛。而要想保证幸福树的美貌&#xff0c;跟人的头发一样&#xff0c;我们要给它适当的修剪&#xff0c;那幸福树怎么修剪呢&#xff1f;为了大家能养出美丽的幸福树来&a…

mybatis传递多个参数_MyBatis 映射器

ps 一个用于生成MyBatis配置文件的插件 mybatis-generator使用方法呢, 是加入maven插件中 然后执行相关命令可以实现自动生成MyBatis配置文件自动映射首先编写无参的javabeanpackage com.ming.MyBatis.POJO;/** * author ming */public class Role { private int id; private S…

计算机软件水平考试什么题型,计算机软考考什么内容

原标题&#xff1a;计算机软考考什么内容计算机软考考试内容有哪些&#xff1f;软考包含三个级别&#xff0c;各级别有多个考试项目&#xff0c;不同的考试项目考试内容也是不同的。软考考试内容大家可以参考各考试项目的考试大纲&#xff0c;包括新版的系统分析师考试大纲、系…

mac os 开启redis_关于Redis,学会这8点就够了

一、redis是什么redis是一种支持Key-Value等多种数据结构的存储系统。可用于缓存、事件发布或订阅、高速队列等场景。该数据库使用ANSI C语言编写&#xff0c;支持网络&#xff0c;提供字符串、哈希、列表、队列、集合结构直接存取&#xff0c;基于内存&#xff0c;可持久化。二…

python第八周小测验_Python语言程序设计第2周测验+练习题复盘

嘿&#xff0c;这里是目录&#xff01; 练习网址 https://python123.io/index 测验2 单项选择题 1. 哪个选项不能正确引用turtle库进而使用setup()函数&#xff1f;‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬…