占位图像 用户ID: 密码: 验证码: 登录 注册     占位图像
 
教育168搜索

a
频道信息
学前教育 基础教育
小学 初中
高中 高等教育
心理学 机械工程
园林 IT教育
办公软件 Director
Authorware 图形图象
FIREWORKS CORELDRAW
Maya PhotoShop
AutoCAD 3D
操作系统 Windows xp
Windows Vista Linux
Windows 2003 Windows 2000
FreeBSD 注册表
网站制作 FLASH
Dreamweaver CSS教程
装修设计 LightScape
装修风水 方案设计
英语 商务外语
素质教育 法制教育
企业培训
最新更新
·了解Linux系统强大的控制
·VMWare虚拟机上安装Ub
·Linux安装不求人 无需分
·Ubuntu6.0.6下的a
·在Linux桌面上 随意使用
·Ubuntu 7.04 桌面
·linux学习(远程控制跟I
·在Linux系统下优化Ora
·Ubuntu Linux:M
·在Linux系统下建立强大的
·Linux系统下如何加载U盘
·在嵌入式Linux中实现80
·Linux下安装JDK,To
·如何恢复误删除的Linux文
·Linux系统环境下的高级隐
·内核操作 Linux2.6内
·轻松实现 Linux系统下互
·Linux操作系统下利用SS

点击排行
·Ubuntu Linux:M
·在Linux桌面上 随意使用
·在Linux系统下优化Ora
·linux学习(远程控制跟I
·Ubuntu 7.04 桌面
·如何恢复误删除的Linux文
·Linux系统下如何加载U盘
·Linux操作系统下利用SS
·无线技术在Linux操作系统
·内核操作 Linux2.6内
·Ubuntu6.0.6下的a
·在嵌入式Linux中实现80
·在Linux系统下建立强大的
·提高Linux系统性能加速网
·轻松实现 Linux系统下互
·初手学堂;跟我学习安装配置R
·Linux系统环境下的高级隐
·Linux下安装JDK,To

内核操作 Linux2.6内核驱动移植参考
发布日期:2007-5-4  浏览:510次
关键字:

  随着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(%26amp;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(%26amp;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, %26amp;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);

关键字:

相关信息 用户评论
·了解Linux系统强大的控制台、终端和shell
·VMWare虚拟机上安装Ubuntu Linux方法
·Linux安装不求人 无需分割硬盘安装Ubuntu
·Ubuntu6.0.6下的apache2+php5+mysql配置的一些问题
·在Linux桌面上 随意使用Windows的文档
·Ubuntu 7.04 桌面服务器配置
·linux学习(远程控制跟IP地址配置)
·在Linux系统下优化Oracle具体步骤
·Ubuntu Linux:MySQL安装指南
·在Linux系统下建立强大的FTP搜索引擎
·Linux系统下如何加载U盘或移动硬盘
·在嵌入式Linux中实现802.11b无线网关
·Linux下安装JDK,Tomcat及设置Cron程序
·如何恢复误删除的Linux文件
·Linux系统环境下的高级隐藏技术介绍
·轻松实现 Linux系统下互联网过滤功能
·Linux操作系统下利用SSH进行远程控制
·制作在软盘上跑的Linux引导器详细过程

 

更多评论

验证码:
验证码