linux3.0.4编译LDD中的scull全过程

摘要:
3.未知的“ioctl”指定的初始值设定项Linux 2.6.29和Linux 2.6.38内核在文件中_操作结构已更改。否则,它将继续在Linux 2.6.38内核中使用。ioctl成员将在编译时报告错误:error:unknown field'iotl'specifiedininitializer,structfile_操作结构在include/Linux/fs中定义。h文件。

按照惯例,我是应该先写一些本章的收获的,不过太晚了。

在看完第三章之后开始编译,错误一堆,几乎崩溃,幸亏经过不断的百度,总算解决了问题,我发现

我遇到问题比较多,算是集中七个龙珠了吧,感谢先行的大神们。

1. CFLAGS was changed in "examples/scull/Makefile". Fix it to use EXTRA_CFLAGS.  Stop.

    由于LDD3使用的是2.6.10内核,很多东西已经发生了变化,这里提示我们修改Makefile中的CFLAGS,用EXTRA_CFLAGS代替,照它说的做就可以。

2、提示找不到文件linux/config.h:

    在2.6.19开始的内核中删除了config.h文件,因此只要在mian.c中注释掉#include<linux/config.h>即可。

3. unknown field ‘ioctl’ specified in initializer

linux2.6.29和linux2.6.38的内核在file_operations结构发生了变化,否则在linux2.6.38内核中,继续使用.ioctl成员,编译时就会报错:error: unknown field 'ioctl' specified in initializer,struct file_operations结构体定义在include/linux/fs.h文件中。

linux2.6.38内核取消了原有的ioctl成员,添加来新的成员

  1.         long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);    原来的ioctl 但是返回值变为long
  2.         long (*compat_ioctl) (struct file *, unsigned int, unsigned long); 内核空间64位,用户空间32位

会出现 warning: initialization from incompatible pointer type

出现此种warnning 的原因  “不兼容的指针类型初始化”

是你定义的函数类型与接口函数的类型不一样,如把返回值 long 定义成了 int 

这两个问题都对驱动有影响。

static const struct file_operations 。。。 = {
。。。。。。
   .unlocked_ioctl = 。。。,
。。。。。。
};

4. 错误: 隐式声明函数‘init_MUTEX’ [-Werror=implicit-function-declaration]

在新版本的linux内核中,init_mutex已经被废除了,新版本使用sema_init函数。

注意:多处调用这个函数。

clip_image007

5.error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)
原因缺少头文件 #include <linux/sched.h> 添加后即可通过编译 !
注意:多处调用这个函数。
 
6. 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);
注意:还有scull_u_lock,scull_c_lock做同样的修改。
 
7. ‘struct task_struct’ has no member named ‘uid’
struct task_struct定义在include/linux/sched.h中,原来task_struct结构体定义有所改动,将uid和euid等挪到 cred中,见            
       include/linux/sched.h和include/linux/cred.h。
    因此只需要将报error的代码所在的文件做如下修改
    current->uid 修改为 current->cred->uid
    current->euid 修改为 current->cred->euid
 
总算集齐了七龙珠,模块运行起来了,虽然七个问题的解决方法都是网上都有的,但是我还是没有在同一篇文章中全都遇到他们,所以写下来。

免责声明:文章转载自《linux3.0.4编译LDD中的scull全过程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CSS3 制作一个边框向周围散开的按钮效果华为高斯GaussDB T数据库实战培训(7小时速成版)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

虚拟化技术实现 — QEMU-KVM

目录 文章目录 目录 前文列表 KVM QEMU QEMU-KVM QEMU-KVM 调用 KVM 内核模块启动虚拟机的流程概要 前文列表 《虚拟化技术实现 — 虚拟化技术发展编年史》 KVM KVM(Kernel-based Virtual Machine,基于内核的虚拟机)是一种用于 Linux 内核中的虚拟化基础设施。本质是一个嵌入到 Lin...

Qt FFMPEG+OpenCV开启摄像头

//ffmpegDecode.h #ifndef __FFMPEG_DECODE_H__ #define __FFMPEG_DECODE_H__ #include "global.h" extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" /...

cuda8和cuda10切换 以及正确按照配置cuDNN

切换至 cuda-8.0 sudo rm -rf /usr/local/cuda sudo ln -s /usr/local/cuda-8.0 /usr/local/cuda nvcc --version which nvcc 切换至 cuda-10.0 sudo rm -rf /usr/local/cuda sudo ln -s /usr/local/c...

C++实现01串排序

题目内容:将01串首先按长度排序,长度相同时,按1的个数从少到多进行排序,1的个数相同时再按ASCII码值排序。 输入描述:输入数据中含有一些01串,01串的长度不大于256个字符。 输出描述:重新排列01串的顺序,使得串按题目描述的方式排序。 题目分析: (1)定义一个多重集合容器,该容器的元素类型为string,采用设定的比较函数 (2)因为元素是st...

QSS 样式表 (一)

在开发应用程序时,往往对界面的美观有一定的要求。Qt 引入了 QSS 机制,使得界面的美化工作变的轻轻松松。嗯,QSS听着有点耳熟。是的,QSS的语法和CSS类似。在此做些总结。 先来看一个简单的例子。 1 #include <QtGui/QPushButton> 2 #include <QtGui/QWidget> 3...

Android编译大全(六)

6.2. makefile文件控制整个android系统编译的make文件。其内容如下: ### DO NOT EDIT THIS FILE ### include build/core/main.mk ### DO NOT EDIT THIS FILE ###   可以看出,实际上控制编译的文件是:build/core/main.mk 6.3. Make...