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

相关文章

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Python运行中频繁出现Restart提示的解决办法

《Python运行中频繁出现Restart提示的解决办法》在编程的世界里,遇到各种奇怪的问题是家常便饭,但是,当你的Python程序在运行过程中频繁出现“Restart”提示时,这可能不仅仅是令人头疼... 目录问题描述代码示例无限循环递归调用内存泄漏解决方案1. 检查代码逻辑无限循环递归调用内存泄漏2.

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

MySQL错误代码2058和2059的解决办法

《MySQL错误代码2058和2059的解决办法》:本文主要介绍MySQL错误代码2058和2059的解决办法,2058和2059的错误码核心都是你用的客户端工具和mysql版本的密码插件不匹配,... 目录1. 前置理解2.报错现象3.解决办法(敲重点!!!)1. php前置理解2058和2059的错误