您的位置首页>企业动态>

Linux2.6内核驱动移植参考

导读 大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Linux2 6内核驱动移植参考问题。作者:闫伟川随着Linux2 6的发布,由于2 6内核的改

音频解说

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Linux2.6内核驱动移植参考问题。

作者:闫伟川随着Linux2.6的发布,由于2.6内核的改动,各种设备的驱动都要进行不同程度的重写。为了方便Linux爱好者,我将分享这个我自己编译的文档。本文列出了2.6内核和以前版本之间的大部分变化。不幸的是,由于时间和精力有限,没有详细列出每个功能的用法。特别声明:本文内容来源于http:/lwn.net,本网站上也有各个功能的详细说明,供大家参考。如果你需要这份文件的word版本的朋友,请邮寄到weiriver@sohu.com。1.新门户必须包含Linux/init . hmodule _ init(your _ init _ func);module _ exit(your _ exit _ func);旧版本:int init _ module(void);void clean up _ module(voi);两者都可以在2.4中使用,不需要在后面显示入口函数包含任何头文件。2、GPL MODULE_LICENSE('双BSD/GPL ');旧版本:MODULE _ LICENSE(' GPL ');3.模块参数必须明确包含Linux/module PAM . hm module _ param(名称、类型、perm);module _ param _ named(名称、值、类型、perm);定义参数module _ param _ string(名称、字符串、len、perm);module_param_array(名称、类型、编号、perm);旧版本:MODULE_PARM(变量,类型);MODULE_PARM_DESC(变量,类型);4.模块别名MODULE_ALIAS('别名-名称');这是新的。旧版本需要在/etc/modules.conf中配置,现在可以在代码中实现。5.模块计数int try_module_get(模块);module _ put();旧版:MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT 6。符号导出:只有显示的导出符号才能被其他模块使用。默认情况下,不会导出所有符号,也不需要使用EXPORT_NO _SYMBOLS。除非使用EXPORT_NO_SYMBOLS 7,内核版本检查需要在多个文件中包含linux/module.h,否则不需要定义__NO_VERSION__ old version:当linux/module.h包含在多个文件中时,需要在主文件之外的其他文件中定义__NO_VERSION__以防止版本定义重复。8.设备号kdev_t被废除且不可用,新的dev_t被扩展为32位数字、主设备号的12位数字和辅助设备号的20位数字。无符号整数(结构索引节点*索引节点);无符号int imajor(struct inode * inode);旧版本:8位主设备号,8位从设备号int MAjor(kdev _ t dev);int MINOR(kdev _ t dev);9.更改内存分配的头文件所有的内存分配函数都包含在头文件linux/slab.h中,没有原来linux/malloc.h的旧版本:内存分配函数包含在头文件linux/malloc.h 10中,结构的初始gcc开始采用ANSI C struct结构的初始化形式:static structure _ structure={ . field 1=value,field2=值,};旧版本:非标准初始试算表静态structure some _ structure={ field 1: value,field2:Value,};1.用户模式助手intcall _ user模式助手(char * path,char * * argv,char * * envp,int wait);添加等待参数12,request _ module()request _ module(' foo-device-% d ',数字);旧版本:char module _ name[32];printf(module_name,' foo-device-%d ',number);request_module(模块名);13.dev_t 1引起的字符设备的变化。将主设备号和辅助设备号作为无符号的I minor(struct inode * inode);无符号imajor(struct inode * inode);2.旧的register_chrdev()的用法没有改变,它是向后兼容的,但是它不能访问设备号大于256的设备。3.新接口是a)注册字符设备范围int register _ chrdev _ region(dev _ t from,无符号计数,char * name);b)动态申请主设备号intalloc _ chrdev _ region(dev _ t * dev,无符号基次,无符号计数,char * name);看到这两个功能就很郁闷。它与file_operaTIons结构有什么关系?别担心!c)包含linux/cdev.h,使用struct cdev和file_operaTIons连接struct cdev * cdev _ alloc(void);void cdev_init(struct cdev *cdev,struct file _ operations * fops);int cdev_add(struct cdev *cdev,dev_t dev,无符号计数);(分别申请cdev结构,连接fops,将设备加入系统!多复杂啊!d)void cdev _ del(struct cdev * cdev);它只能在cdev_add中成功执行后运行。

e)辅助函数kobject _ put(cdev-kobj);struct koo object * cdev _ get(struct cdev * cdev);void cdev _ put(struct cdev * cdev);这一部分变化和新增的/sys/dev有一定的关联。 14、 新增对/proc的访问操作linux/seq_file.h以前的/proc中只能得到字符串,序列文件操作能得到如长的等多种数据。相关函数:静态结构序列操作必须实现这个类似文件操作得数据中得各个成员函数seq _ printf();int seq_putc(struct seq_file *m,char c);int seq_puts(struct seq_file *m,const char * s);int seq_escape(struct seq_file *m,const char *s,const char * ESC);int seq_path(struct seq_file *m,struct vfsmount *mnt,struct dentry *dentry,char * ESC);seq_open(文件,CT _ seq _ ops);等等15、 底层内存分配1、linux/malloc.h头文件改为linux/slab.h

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。