ldd3 源码编译之 scullc 字符设备驱动 错误解决办法

2023-10-17 01:48

本文主要是介绍ldd3 源码编译之 scullc 字符设备驱动 错误解决办法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用内核版本-linux-3.2 


错误1:

  1. make -/lib/modules/3.2.0/build M=/home/wrk/works/drivers/ldd3/examples/scullc LDDINC=/home/wrk/works/drivers/ldd3/examples/scullc modules
  2. make[1]: Entering directory `/home/wrk/works/drivers/linux-kernel/linux-3.2'
  3. scripts/Makefile.build:49: *** CFLAGS was changed in "/home/wrk/works/drivers/ldd3/examples/scullc/Makefile". Fix it to use ccflags-y. Stop.
  4. make[1]: *** [_module_/home/wrk/works/drivers/ldd3/examples/scullc] Error 2
  5. make[1]: Leaving directory `/home/wrk/works/drivers/linux-kernel/linux-3.2'
  6. make: *** [modules] Error 2
这个错误还比较好解决,像提示的那样在Makefile中用ccflags-y替换CFLAGS 


错误2:

  1. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:52:1: error: unknown type name ‘kmem_cache_t’

这是因为kmem_cache_t结构被换成了kmem_cache。而kmem_cache定义在<linux/slab_def.h>和<linux/slub_def.h>。但是你并不需要包含这两个文件中的一个。因为<linux/slab.h>会根据CONFIG_SLUB等来判断具体包含<linux/slab_def.h>,还是<linux/slub_def.h>。故例程中需要将

kmem_cache_t *scullc_cache;
改为:
struct kmem_cache *scullc_cache;


错误3:

  1. /home/wrk/works/drivers/ldd3/examples/scullc/main.c: In function ‘scullc_defer_op’:
  2. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:437:54: error: macro "INIT_WORK" passed 3 arguments, but takes just 2
  3. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:437:2: error: ‘INIT_WORK’ undeclared (first use in this function)
这里需要将

  1. INIT_WORK(&stuff->work, scull_do_deferred_op, stuff);
改为:

  1. INIT_WORK(&stuff->work, scull_do_deferred_op);
并且将scullc_do_deferred_op函数改为
  1. static void scullc_do_deferred_op(struct work_struct *p)
  2. {
  3.         struct async_work *stuff = container_of(p, struct async_work, work);
  4.         aio_complete(stuff->iocb, stuff->result, 0);
  5.         kfree(stuff);
  6. }


错误4: 
  1. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:467:2: error: unknown field ‘ioctl’ specified in initializer
这里因为内核接口变化需要将.ioctl改为 .unlocked_ioctl

错误5:

  1. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:558:4: error: too many arguments to function ‘kmem_cache_create’
函数kmem_cache_create的原型已经改变:
struct kmem_cache *kmem_cache_create(const char *, size_t, size_t, unsigned long, void (*)(void *));故调用它的时候应该将参数做出相应的改变。需要将最后一个NULL去掉。

下面来解决warning:
  1. /home/wrk/works/drivers/ldd3/examples/scullc/main.c: In function ‘scullc_defer_op’:
  2. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:437:2: warning: assignment from incompatible pointer type [enabled by default]
  3. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:438:2: warning: passing argument 1 of ‘schedule_delayed_work’ from incompatible pointer type [enabled by default]
  4. include/linux/workqueue.h:363:12: note: expected ‘struct delayed_work *’ but argument is of type ‘struct work_struct *’
  5. /home/wrk/works/drivers/ldd3/examples/scullc/main.c: At top level:
  6. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:467:2: warning: initialization from incompatible pointer type [enabled by default]
  7. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:467:2: warning: (near initialization for ‘scullc_fops.unlocked_ioctl’) [enabled by default]
  8. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:470:2: warning: initialization from incompatible pointer type [enabled by default]
  9. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:470:2: warning: (near initialization for ‘scullc_fops.aio_read’) [enabled by default]
  10. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:471:2: warning: initialization from incompatible pointer type [enabled by default]
  11. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:471:2: warning: (near initialization for ‘scullc_fops.aio_write’) [enabled by default]
1.把
  1. struct async_work {
  2. struct kiocb *iocb;
  3. int result;
  4. struct work_struct work;
  5. };
改为:
  1. struct async_work {
  2. struct kiocb *iocb;
  3. int result;
  4. struct delayed_work delayed_work;
  5. }
然后把:
  1. INIT_WORK(&stuff->work, scull_do_deferred_op, stuff);
  2. schedule_delayed_work(&stuff->work, HZ/100);
改为:
  1. INIT_DELAYED_WORK(&(stuff->delayed_work), scullc_do_deferred_op);
  2. schedule_delayed_work(&(stuff->delayed_work), HZ/100);
再编译即可通过。

(我的环境是 linux-3.5,部分适用,但还有以下的问题出错 )
1、main.c:652: error: implicit declaration of function ‘init_MUTEX’
该错误是因为init_MUTEX函数再新到内核中已经被废弃,不再使用,改成sema_init函数。因为原来到 init_MUTEX的实现里面调用到也是这个函数。


/*init_MUTEX(&scull_devices[i].sem);改成下面那样即可*/
sema_init(&scull_devices[i].sem,1);

2. access.c:99: error: ‘SPIN_LOCK_UNLOCKED’ undeclared here (not in a function)
是说SPIN_LOCK_UNLOCKED不被认识了,其实也是被废弃了,改用DEFINE_SPINLOCK即可,如
/*static spinlock_t scull_w_lock = SPIN_LOCK_UNLOCKED; 改成下面到方式*/
static DEFINE_SPINLOCK(scull_w_lock);

3. 另外,在编译成功后,运行 sudo ./scull_load 时会出错:
awk: line 1: syntax error at or near ==mknod: "0" 后缺少操作数请尝试执行"mknod --help"来获取更多信息。mknod: "1" 后缺少操作数请尝试执行"mknod --help"来获取更多信息。mknod: "2" 后缺少操作数请尝试执行"mknod --help"来获取更多信息。mknod: "3" 后缺少操作数请尝试执行"mknod --help"来获取更多信息。chgrp: 无法访问"/dev/scull[0-3]": 没有那个文件或目录chmod: 无法访问"/dev/scull[0-3]": 没有那个文件或目录mknod: "4" 后缺少操作数请尝试执行"mknod --help"来获取更多信息。mknod: "5" 后缺少操作数请尝试执行"mknod --help"来获取更多信息。mknod: "6" 后缺少操作数请尝试执行"mknod --help"来获取更多信息。mknod: "7" 后缺少操作数请尝试执行"mknod --help"来获取更多信息。chgrp: 无法访问"/dev/scullpipe[0-3]": 没有那个文件或目录chmod: 无法访问"/dev/scullpipe[0-3]": 没有那个文件或目录mknod: "8" 后缺少操作数请尝试执行"mknod --help"来获取更多信息。chgrp: 无法访问"/dev/scullsingle": 没有那个文件或目录chmod: 无法访问"/dev/scullsingle": 没有那个文件或目录mknod: "9" 后缺少操作数请尝试执行"mknod --help"来获取更多信息。chgrp: 无法访问"/dev/sculluid": 没有那个文件或目录chmod: 无法访问"/dev/sculluid": 没有那个文件或目录mknod: "10" 后缺少操作数请尝试执行"mknod --help"来获取更多信息。chgrp: 无法访问"/dev/scullwuid": 没有那个文件或目录chmod: 无法访问"/dev/scullwuid": 没有那个文件或目录mknod: "11" 后缺少操作数请尝试执行"mknod --help"来获取更多信息。chgrp: 无法访问"/dev/scullpriv": 没有那个文件或目录chmod: 无法访问"/dev/scullpriv": 没有那个文件或目录spark@spark-Dell:~/LDD3-ex/examples/scull$ ls /dev/scull*/dev/scull /dev/scullpipe
从第一行可看出,在运行 awk 命令时就已经出错,导致最后无法创建 scull0~3 ,解决办法:
在 scull_load 中,把
major=$(awk "\\$2==\"$module\" {print \\$1}" /proc/devices)
改为
major=$(awk "\$2==\"$module\" {print \$1}" /proc/devices)


至此,编译及加载都已OK
spark@spark-Dell:~/LDD3-ex/examples/scull$ sudo ./scull_load
insmod: error inserting './scull.ko': -1 File exists
spark@spark-Dell:~/LDD3-ex/examples/scull$ sudo ./scull_unload
spark@spark-Dell:~/LDD3-ex/examples/scull$ sudo ./scull_load
spark@spark-Dell:~/LDD3-ex/examples/scull$ ls /dev/scull*
/dev/scull   /dev/scull2     /dev/scullpipe0  /dev/scullpipe3   /dev/sculluid
/dev/scull0  /dev/scull3     /dev/scullpipe1  /dev/scullpriv    /dev/scullwuid
/dev/scull1  /dev/scullpipe  /dev/scullpipe2  /dev/scullsingle
spark@spark-Dell:~/LDD3-ex/examples/scull$ ls /proc/scull*
/proc/scullmem  /proc/scullpipe  /proc/scullseq





这篇关于ldd3 源码编译之 scullc 字符设备驱动 错误解决办法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/222109

相关文章

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

SpringBoot3匹配Mybatis3的错误与解决方案

《SpringBoot3匹配Mybatis3的错误与解决方案》文章指出SpringBoot3与MyBatis3兼容性问题,因未更新MyBatis-Plus依赖至SpringBoot3专用坐标,导致类冲... 目录SpringBoot3匹配MyBATis3的错误与解决mybatis在SpringBoot3如果

nginx配置错误日志的实现步骤

《nginx配置错误日志的实现步骤》配置nginx代理过程中,如果出现错误,需要看日志,可以把nginx日志配置出来,以便快速定位日志问题,下面就来介绍一下nginx配置错误日志的实现步骤,感兴趣的可... 目录前言nginx配置错误日志总结前言在配置nginx代理过程中,如果出现错误,需要看日志,可以把

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp