LDD3示例代码Scull编译问题

在运行《Linux设备驱动程序》第三版书中的示例代码时出现了很多编译错误 ,主要原因是我的系统内核版本为 2.6.39,而示例代码运行的内核版本为 2.6.10。以下是我遇到的问题以及解决方案:


  • make时出现错误:CFLAGS was changed ....Fix it to use EXTRA_FLAGS
    解决方法:将Makefile中的
    CFLAGS += $(DEBFLAGS) 
    CFLAGS += -I$(LDDINC)
    
    改为
    EXTRA_CFLAGS += $(DEBFLAGS) 
    EXTRA_CFLAGS += -I$(LDDINC)
    

  • error: linux/config.h: No such file or directory
    原因:config.h这个头文件在2.6.19的内核版本以后就没有了
    解决方法:将该行代码注释掉

  • 如图错误:

    解决方法:引用头文件 #include<linux/sched.h>

  • error: 'struct task_struct' has no member named 'uid'
    原因:task_struct结构体定义有所改动,将uideuid等挪到了cred中,参见include/linux/sched.hinclude/linux/cred.h两个头文件
    解决方案 :将报错的代码做如下修改(参考网址):
    current->uid 修改为 current->cred->uid
    current->euid 修改为 current->cred->euid

  • SPIN_LOCK_UNLOCKED’未声明(不在函数内)
    原因:SPIN_LOCK_UNLOCKED自2.6.19被弃用,将在2.6.39中删除。
    解决方法:将static spinlock_t scull_u_lock = SPIN_LOCK_UNLOCKED;改为static DEFINE_SPINLOCK(scull_u_lock);。别的用到SPIN_LOCK_UNLOCKED的地方也作相应修改。参考网址

  • unknown field 'ioctl' specified in initializer
    原因:2.6.36内核之后,file_operations结构体去掉了原来的ioctl,添加了两个新的成员:
    long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);           
    long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
    
    解决方法: 将代码中file_operations结构体中的.ioctl 改为 .compat_ioctl 即可。参考网址

  • error: implicit declaration of function ‘init_MUTEX’)
    原因:init_MUTEX在 Linux2.6.37 之后的内核中已经被废除了, 新版本使用 sema_init函数:static inline void sema_init(struct semaphore *sem, int val);init_MUTEX(&sem)等同于sema_init(&sem, 1)
    解决方法:将代码中用到init_MUTEX的地方都替换为sema_init。也可使用参考网址的另一种方法。

  • error: macro "INIT_WORK" passed 3 arguments, but takes just 2
    原因:从2.6.20的内核开始,INIT_WORK宏做了改变,原来是三个参数,后来改成了两个参数。
    解决方法:将代码按如下方式改变(参考网址):
    static void ppsc_tq_int (void *data)   
    --> 
    static void ppsc_tq_int (struct work_struct *data)
    
    INIT_WORK (&pha->wq, ppsc_tq_int, pha); 
    --> 
    INIT_WORK (&pha->wq, ppsc_tq_int);
    

  • error: ‘SA_INTERRUPT’ undeclared (first use in this function)
    原因:2.6.24以后删除了SA_INTERRUPT,使用IRQF_DISABLED代替。SA_SHIRQIRQF_SHARED代替(参考网址
    解决方法:将SA_INTERRUPT修改为IRQF_DISABLED即可 。参考网址

  • error: ‘struct device’ has no member named ‘driver_data’
    原因:driver_data 已经被移入struct device_private中,该结构在/drivers/base/base.h中定义。

  • error: ‘NOPAGE_SIGBUS’ undeclared (first use in this function)error: unknown field ‘nopage’ specified in initializer
    原因:新版本vm_operations_struct去掉了nopage成员,参见/include/linux/mm.h
    解决方法:注释掉相关内容参考网址

  • error: ‘struct device’ has no member named ‘bus_id’
    原因:新版本的内核中struct device 已经没有bus_id成员,而是通过static inline const char *dev_name(const struct device *dev)extern int dev_set_name(struct device *dev, const char *name, ...)对设备的名字进行操作。参考网址
    解决方法:针对我的代码:将strncpy(ldddev->dev.bus_id, ldddev->name, BUS_ID_SIZE);改为dev_set_name(&ldddev->dev, ldddev->name);

  • ‘struct attribute’ has no member named ‘owner’
    原因:新版本内核struct attribute结构中已经没有owner成员
    解决方法:我的解决方法是先注释掉相关语句。

  • error: unknown field ‘hotplug’ specified in initializer
    原因:新版本内核struct bus_type结构中已经没有hotplug成员
    解决方法:我的解决方法是先注释掉相关语句。

  • no symbol version for ...
    原因:这是linux kernel 2.6.26 之后版本的bug。参考网址
    解决方法:只要将模块中的Makefile中加上KBUILD_EXTRA_SYMBOLS,重新编译模块即可。

发布了5 篇原创文章 · 获赞 0 · 访问量 205
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览