zoukankan      html  css  js  c++  java
  • linux3.0.4编译LDD中的scull全过程

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

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

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

    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
     
    总算集齐了七龙珠,模块运行起来了,虽然七个问题的解决方法都是网上都有的,但是我还是没有在同一篇文章中全都遇到他们,所以写下来。
  • 相关阅读:
    Spring学习(一):理解IoC容器
    Spring学习(零):我们为什么要学习Spring
    git push提交报错,提示文件过大,且去掉大文件也报同样的错误
    There was a problem with the instance info replicator
    Eureka配置instanceId显示IP
    Cannot execute request on any known server或DiscoveryClient_UNKNOWN/DESKTOP-MQ8D0C9:8761
    Hexo优化 | 创建sitemap站点地图并向Google提交
    matlab与python读取tiff文件
    Visual studio中编译和使用libpng和zlib
    关于softmax、argmax、softargmax
  • 原文地址:https://www.cnblogs.com/likeyiyy/p/3525688.html
Copyright © 2011-2022 走看看