首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 认证考试-> Adobe认证
内核操作 linux2.6内核驱动移植参考_linux教程
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

  随着Linux2.6的发布,由于2.6内核做了教的改动,各个设备的驱动程序在不同程度上要进行改写。为了方便各位Linux爱好者我把自己整理的这分文档share出来。该文当列举了2.6内核同以前版本的绝大多数变化,可惜的是由于时间和精力有限没有详细列出各个函数的用法。

  特别声明:该文档中的内容来自http://lwn.net,该网也上也有各个函数的较为详细的说明可供各位参考。

  1、使用新的入口

  必须包含 <linux/init.h>

  module_init(your_init_func);

  module_exit(your_exit_func);

  老版本:int init_module(void);

  void cleanup_module(voi);

  2.4中两种都可以用,对如后面的入口函数不必要显示包含任何头文件。

  2、GPL

  MODULE_LICENSE("Dual BSD/GPL");

  老版本:MODULE_LICENSE("GPL");

  3、模块参数

  必须显式包含<linux/moduleparam.h>

  module_param(name, type, perm);

  module_param_named(name, value, type, perm);

  参数定义

  module_param_string(name, string, len, perm);

  module_param_array(name, type, num, perm);

  老版本:MODULE_PARM(variable,type);

  MODULE_PARM_DESC(variable,type);

  4、模块别名

  MODULE_ALIAS("alias-name");

  这是新增的,在老版本中需在/etc/modules.conf配置,现在在代码中就可以实现。

  5、模块计数

  int try_module_get(&module);

  module_put();

  老版本:MOD_INC_USE_COUNT 和 MOD_DEC_USE_COUNT

  6、符号导出

  只有显示的导出符号才能被其他模块使用,默认不导出所有的符号,不必使用EXPORT_NO_SYMBOLS

  老板本:默认导出所有的符号,除非使用EXPORT_NO_SYMBOLS

  7、内核版本检查

  需要在多个文件中包含<linux/module.h>时,不必定义__NO_VERSION__

  老版本:在多个文件中包含<linux/module.h>时,除在主文件外的其他文件中必须定义__NO_VERSION__,防止版本重复定义。

  8、设备号

  kdev_t被废除不可用,新的dev_t拓展到了32位,12位主设备号,20位次设备号。

  unsigned int iminor(struct inode *inode);

  unsigned 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 struct some_structure = {

  .field1 = value,

  .field2 = value,

  ..

  };

  老版本:非标准的初试化形式

  static struct some_structure = {

  field1: value,

  field2: value,

  ..

  };

  11、用户模式帮助器

  int call_usermodehelper(char *path, char **argv, char **envp,int wait);

  新增wait参数

  12、request_module()

  request_module("foo-device-%d", number);

  老版本:

  char module_name[32];

  printf(module_name, "foo-device-%d", number);

  request_module(module_name);

  13、dev_t引发的字符设备的变化

  1、取主次设备号为

  unsigned iminor(struct inode *inode);

  unsigned imajor(struct inode *inode);

  2、老的register_chrdev()用法没变,保持向后兼容,但不能访问设备号大于256的设备。

  3、新的接口为

  a)注册字符设备范围

  int register_chrdev_region(dev_t from, unsigned count, char *name);

  b)动态申请主设备号

  int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, 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, unsigned count);

  (分别为,申请cdev结构,和fops连接,将设备加入到系统中!好复杂啊!)

  d)void cdev_del(struct cdev *cdev);

  只有在cdev_add执行成功才可运行。

  e)辅助函数

  kobject_put(&cdev->kobj);

  struct kobject *cdev_get(struct cdev *cdev);

  void cdev_put(struct cdev *cdev);

  这一部分变化和新增的/sys/dev有一定的关联。

  14、新增对/proc的访问操作

  <linux/seq_file.h>

  以前的/proc中只能得到string, seq_file操作能得到如long等多种数据。

  相关函数:

  static struct seq_operations 必须实现这个类似file_operations得数据中得各个成

  员函数。

  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(file, &ct_seq_ops);

  等等

  15、底层内存分配

  1、<linux/malloc.h>头文件改为<linux/slab.h>

  2、分配标志GFP_BUFFER被取消,取而代之的是GFP_NOIO 和 GFP_NOFS

  3、新增__GFP_REPEAT,__GFP_NOFAIL,__GFP_NORETRY分配标志

  4、页面分配函数alloc_pages(),get_free_page()被包含在<linux/gfp.h>中

  5、对NUMA系统新增了几个函数:

  a) struct page *alloc_pages_node(int node_id,

  unsigned int gfp_mask,

  unsigned int order);

  b) void free_hot_page(struct page *page);

  c) void free_cold_page(struct page *page);

  6、 新增Memory pools

  <linux/mempool.h>

  mempool_t *mempool_create(int min_nr,

  mempool_alloc_t *alloc_fn,

  mempool_free_t *free_fn,

  void *pool_data);

  void *mempool_alloc(mempool_t *pool, int gfp_mask);

  void mempool_free(void *element, mempool_t *pool);

  int mempool_resize(mempool_t *pool, int new_min_nr, int gfp_mask);

  16、 per-CPU变量

  get_cpu_var();

  put_cpu_var();

  void *alloc_percpu(type);

  void free_percpu(const void *);

  per_cpu_ptr(void *ptr, int cpu)

  get_cpu_ptr(ptr)

  put_cpu_ptr(ptr)

  老版本使用

  DEFINE_PER_CPU(type, name);

  EXPORT_PER_CPU_SYMBOL(name);

  EXPORT_PER_CPU_SYMBOL_GPL(name);

  DECLARE_PER_CPU(type, name);

  DEFINE_PER_CPU(int, mypcint);

  2.6内核采用了可剥夺得调度方式这些宏都不安全。

  17、内核时间变化

  1、现在的各个平台的HZ为

  Alpha: 1024/1200; ARM: 100/128/200/1000; CRIS: 100; i386: 1000; IA-64:

  1024; M68K: 100; M68K-nommu: 50-1000; MIPS: 100/128/1000; MIPS64: 100;

  PA-RISC: 100/1000; PowerPC32: 100; PowerPC64: 1000; S/390: 100; SPARC32:

  100; SPARC64: 100; SuperH: 100/1000; UML: 100; v850: 24-100; x86-64: 1000.

  2、由于HZ的变化,原来的jiffies计数器很快就溢出了,引入了新的计数器jiffies_64

  3、#include <linux/jiffies.h>

  u64 my_time = get_jiffies_64();

  4、新的时间结构增加了纳秒成员变量

  struct timespec current_kernel_time(void);

  5、他的timer函数没变,新增

  void add_timer_on(struct timer_list *timer, int cpu);

  6、新增纳秒级延时函数

  ndelay();

  7、POSIX clocks 参考kernel/posix-timers.c

  18、工作队列(workqueue)

  1、任务队列(task queue )接口函数都被取消,新增了workqueue接口函数

  struct workqueue_struct *create_workqueue(const char *name);

  DECLARE_WORK(name, void (*function)(void *), void *data);

  INIT_WORK(struct work_struct *work,

  void (*function)(void *), void *data);

  PREPARE_WORK(struct work_struct *work,

  void (*function)(void *), void *data);

  2、申明struct work_struct结构

  int queue_work(struct workqueue_struct *queue,

  struct work_struct *work);

  int queue_delayed_work(struct workqueue_struct *queue,

  struct work_struct *work,

  unsigned long delay);

  int cancel_delayed_work(struct work_struct *work);

  void flush_workqueue(struct workqueue_struct *queue);

  void destroy_workqueue(struct workqueue_struct *queue);

  int schedule_work(struct work_struct *work);

  int schedule_delayed_work(struct work_struct *work, unsigned long

  delay);


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·Java开发工具配置 UltraEdit-JSP教程,Java技巧及代码
·遍历设备管理器的设备-.NET教程,评论及其它
·用正则表达式剔除文本中的HTML标记-ASP教程,正则表达式
·一个通用的DataGridTableStyle的做法-.NET教程,数据库应用
·java连接Oracle数据库-JSP教程,Java技巧及代码
·将XML存入关系数据库-JSP教程,数据库相关
·如何在Web页面上直接打开、编辑、创建Office文档-ASP教程,ASP应用
·asp之日期和时间函数示例-ASP教程,ASP应用
·ASP.Net Web Page深入探讨-ASP教程,ASP应用
·浅析Microsoft .net PetShop程序中的购物车和订单处理模块(Profile技术,异步MSMQ消息)-.NET教程,.NET Framework
最新文章
·fireworks 8绘制精致指南针图案_fireworks教程
·卸载多重引导系统中的windows vista操作系统_windows vista
·如何做到google adsense好收入的几点_网赚技巧
·百度主题推广和google adsense的综合比较_网赚技巧
·[新闻会客厅]孙雁:八零后的女闪客_站长访谈
·“流量交换型站点”访客黏度问题凸显_站长心得
·大唐社区站长经验谈社区运营_站长心得
·blog站点如何用rss搜索来推广_站长心得
·自我防护web站点和恶意链接的方法_站长心得
·网站投资你和我的20个自身检查(2)_站长心得
相关主题
西部数码虚拟主机

友情链接
CNNIC 西部数码
万网 自助建站
虚拟主机 asp空间
域名注册 域名
域名申请 主页空间
论坛空间 网站空间
国际域名 虚拟空间
空间租用 DDOS防火墙
成都主机托管 四川主机托管
主机租用 服务器租用
网站目录 自助建站
虚拟主机 网址大全
软件下载
自助链接
虚拟主机资讯 特价虚拟主机
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
发表评论 打印  刷新     关闭