热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Linux驱动开发之2.6.38版本下LDD3驱动的编译

这两天一直看LDD3,看的很爽,似懂非懂的样子,今天开始编译例程代码scull的时候,悲剧很大,折腾了很久,主要是我Ubuntu11.04的内核版本是2.6.38,而例程编译的内核版本是2.6.10,这中间内核本身已经发生了翻天覆地的变化。说白了,能make过去,那才出鬼了,好吧,一个错误一个错误来,不急。 
这两天一直看LDD3,看的很爽,似懂非懂的样子,今天开始编译例程代码scull的时候,悲剧很大,折腾了很久,主要是我Ubuntu 11.04的内核版本是2.6.38,而例程编译的内核版本是2.6.10,这中间内核本身已经发生了翻天覆地的变化。说白了,能make过去,那才出鬼了,好吧,一个错误一个错误来,不急。

        直接make,第一个问题来了。。。。

        根据提示把Makefile里的CFLAGS 改成EXTRA_CFLAGS 即可,继续……

提示:

        如果您使用的是vi,可以和我一样一道命令解决:0,$s/CFLAGS/EXTRA_CFLAGS/g

        别忘了保存,继续make……

        第二个问题来了。。。。

       好吧,我不理解了,讲驱动最常见的ioctl 你不认识,why?

       原来在2.6.36版本更新中,file_operations发生了很大的变化,去掉了ioctl,而加入了两个新函数

  1. long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);   
  2. long (*compat_ioctl) (struct file *, unsigned int, unsigned long);  

         注:2.6.38的file_operation结构体

view plaincopy to clipboardprint?
  1. struct file_operations {   
  2.     struct module *owner;   
  3.     loff_t (*llseek) (struct file *, loff_t, int);   
  4.     ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);   
  5.     ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);   
  6.     ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);   
  7.     ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);   
  8.     int (*readdir) (struct file *, void *, filldir_t);   
  9.     unsigned int (*poll) (struct file *, struct poll_table_struct *);   
  10.     long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);   
  11.     long (*compat_ioctl) (struct file *, unsigned int, unsigned long);   
  12.     int (*mmap) (struct file *, struct vm_area_struct *);   
  13.     int (*open) (struct inode *, struct file *);   
  14.     int (*flush) (struct file *, fl_owner_t id);   
  15.     int (*release) (struct inode *, struct file *);   
  16.     int (*fsync) (struct file *, int datasync);   
  17.     int (*aio_fsync) (struct kiocb *, int datasync);   
  18.     int (*fasync) (intstruct file *, int);   
  19.     int (*lock) (struct file *, intstruct file_lock *);   
  20.     ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);   
  21.     unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);   
  22.     int (*check_flags)(int);   
  23.     int (*flock) (struct file *, intstruct file_lock *);   
  24.     ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);   
  25.     ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);   
  26.     int (*setlease)(struct file *, longstruct file_lock **);   
  27.     long (*fallocate)(struct file *file, int mode, loff_t offset,   
  28.               loff_t len);   
  29. };  

问题找到了,那么怎么解决呢?在main.c 文件中:

按照我下面的代码这样改就OK了。  

  1.  * The unlocked_ioctl() implementation   
  2.  */   
  3. int scull_unlocked_ioctl(struct file *filp,   
  4.                  unsigned int cmd, unsigned long arg)  

还有在file_operation 赋值处修改如下:

  1. struct file_operations scull_fops = {   
  2.     .owner =    THIS_MODULE,   
  3.     .llseek =   scull_llseek,   
  4.     .read =     scull_read,   
  5.     .write =    scull_write,   
  6.     .unlocked_ioctl =    scull_unlocked_ioctl,   
  7.     .open =     scull_open,   
  8.     .release =  scull_release,   
  9. };  

pipe.cscull.h 以及access.h 中也类似修改。


推荐阅读
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 可能原因是需要dash执行输入:sudodpkg-reconfiguredash并在出现的界面选择no或 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 本文介绍了在Docker容器技术中限制容器对CPU的使用的方法,包括使用-c参数设置容器的内存限额,以及通过设置工作线程数量来充分利用CPU资源。同时,还介绍了容器权重分配的情况,以及如何通过top命令查看容器在CPU资源紧张情况下的使用情况。 ... [详细]
  • 本文讨论了在Linux系统中,使用chown命令将django项目目录下的static目录的拥有者从root改为eureka的问题。作者尝试了多种命令,包括chown和sudo chown等,但都没有成功修改拥有者。文章提供了相关目录的权限信息,并补充了项目所在磁盘和操作系统的信息。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 在ubuntu服务器上安装vscode,但是目前使用的方法都无法成功。第一次安装经历:安装完anaconda后有自动安装vscode的选项,输入yes后,没有出现错误,但是在终端输 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • STM32与FPGA的对比及学习建议
    本文对比了野火STM32F103指南针板和Xilinx的PYNQ-Z2板(ZYNQ-7020),介绍了野火STM32F103指南针板的学习资料和讲解视频的详细程度,建议初学者学习野火的资料。同时,介绍了STM32开发所用的Keil程序和C指针的重要性。对于ZYNQ-7020的开发,提到了其自带的Linux、Ubuntu18.4系统以及使用SD卡烧入镜像的方法。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 本文介绍了如何在使用emacs时去掉ubuntu的alt键默认功能,并提供了相应的操作步骤和注意事项。 ... [详细]
  • 本文介绍了在Ubuntu下制作deb安装包及离线安装包的方法,通过备份/var/cache/apt/archives文件夹中的安装包,并建立包列表及依赖信息文件,添加本地源,更新源列表,可以在没有网络的情况下更新系统。同时提供了命令示例和资源下载链接。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 本文介绍了在Web应用系统中,数据库性能是导致系统性能瓶颈最主要的原因之一,尤其是在大规模系统中,数据库集群已经成为必备的配置之一。文章详细介绍了主从数据库架构的好处和实验环境的搭建方法,包括主数据库的配置文件修改和设置需要同步的数据库等内容。MySQL的主从复制功能在国内外大型网站架构体系中被广泛采用,本文总结了作者在实际的Web项目中的实践经验。 ... [详细]
author-avatar
BuauOoO_987
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有