详解Linux操作系统设备驱动兼容性

互联网 | 编辑: 杨剑锋 2006-10-15 09:00:00转载 一键看全文



      可选标志

标志是文本串,每个都由括号包含,并由空格分隔。参考本模块的模块列表。这个列表整体被包含在方括号内,表中的单个名字由空格隔开。

下面是/proc/modules在2.1.43中的可能内容:

morgana% cat /proc/modules ipv6 57164 -1 netlink 3180 0 [ipv6] floppy 45960 1 (autoclean) floppy 45960 1 (autoclean) monitor 516 0 (unused)

在这个屏幕快照中,ipv6没有使用计数,并依赖于netlink;floppy已经被kerneld加载,由“autoclean”标志给出,monitor是我的一个小工具,控制一些状态灯,并在系统终止时关掉我的计算机。如你所看到的,它是“unused”,我并不关心它的使用计数。

文件操作

有几个文件操作在2.1里与2.0有不同的原型。这主要是出于处理大小不能放入32位的文件的需要。其不同由头文件sysdep-2.1.h处理,它根据使用的核心版本定义了几个伪类型。文件操作中引入的仅有的显著创新是poll方法,它用完全不同的实现代替了select方法。

原型的不同

四个文件操作表征一个新的原型;它们是:

long long (*llseek) (struct inode *, struct file *, long long, int); long (*read) (struct inode *, struct fle *, char *, unsigned long); long (*write) (struct inode *, struct file *, const char *, unsigned long); int (*release) (struct inode *, struct file *); 它们在2.0中的对应者是: int (*lseek) (struct inode *, struct file *, off_t, int); int (*read) (struct inode *, struct file *, char *, int); int (*write) (struct inode *, struct file *, const char *, int); void (*release) (struct inode *, struct file *);

如你所见的,其不同在于它们的返回值(它允许了更大的范围),还有count和offset参数。头文件sysdep-2.1.h通过定义下面的宏处理这些不同:

read_write_t这个宏扩展为参数count的类型以及read和write的返回值。

lssek_t这个宏扩展为llseek的返回值类型。方法名字的改变(从lseek到llseek)并不是个问题,因为你一般在file_operations中并不用名字对域赋值,而是声明一个静态结构。

lseek_off_t lseek的offset参数。

release_t release方法的返回值;或为void或为int。

release_return( int return_value)这个宏可以用来从release方法返回。它的参数用来返回一个错误代码:0表示成

功,负值表示失败。在比2.1.31老的核心中,这个宏扩展为return,因为这个方法返回void。

用前面的宏,一个可移植的驱动程序原型是:

lseek_t my_lseek(struct inode *, struct file *, lseek_off_t, int); read_write_t my_read(struct inode *, struct file *, char *, count_t); read_write_t my_write(struct inode *, struct file *, const char *, count_t); release_t my_release(struct inode *, struct file *);

提示:试试键盘 “← →” 可以实现快速翻页 

一键看全文

本文导航

相关阅读

每日精选

点击查看更多

首页 手机 数码相机 笔记本 游戏 DIY硬件 硬件外设 办公中心 数字家电 平板电脑