Chinaunix首页 | 论坛 | 博客
  • 博客访问: 47859
  • 博文数量: 11
  • 博客积分: 450
  • 博客等级: 下士
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-25 17:05
文章存档

2005年(11)

我的朋友

分类: LINUX

2005-12-02 09:16:32

文件: Linux2.6内核驱动移植.rar
大小: 10KB
下载: 下载
Linux2.6内核驱动移植

作者:weiriver@sohu.com

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

      特别声明:该文档中的内容来自,该网也上也有各个函数的较为详细的说明可供各位参考。如果需要该文档的word版的朋友,mailweiriver@sohu.com索取。

1  使用新的入口

       必须包含

       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  模块参数

       必须显式包含

       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  内核版本检查

       需要在多个文件中包含时,不必定义__NO_VERSION__

       老版本:在多个文件中包含时,除在主文件外的其他文件中必须定义__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  内存分配头文件变更

       所有的内存分配函数包含在头文件,而原来的不存在

       老版本:内存分配函数包含在头文件

10       结构体的初试化

       gcc开始采用ANSI Cstruct结构体的初始化形式:

       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)包含 ,利用struct cdevfile_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的访问操作

      

       以前的/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头文件改为

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

       3、新增__GFP_REPEAT__GFP_NOFAIL__GFP_NORETRY分配标志

       4、页面分配函数alloc_pages()get_free_page()被包含在

       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

      

       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

              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()     

 

阅读(1051) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~