|
详解Linux操作系统设备驱动兼容性(7) void clear_bit(int nr, volatile void * addr); void change_bit(int nr, volatile void * addr);
int test_and_set_bit(int nr, volatile void * addr); int test_and_clear_bit(int nr, volatile void * addr); int test_and_change_bit(int nr, volatile void * addr); int test_bit(nr, addr);
如果你想获得与2.0的后向兼容性,你可以在你的模块中包含sysdep-2.1.h,并使用新的原型。
转换函数
版本2.1.10引入了一个新的转换函数,在中声明。这些函数可以用来访问多字节值,只要这个值已知是小印地安字节序或大印地安字节序。因为这些函数为写驱动程序代码提供了很好的快捷方式,头文件sysdep-2.1.h在较早的版本就已经定义了它们。2.1核心源码提供的本身实现比sysdep-2.1.h提供的可移植的实现要快,因为它可以利用体系相关的功能。
新函数对应下面的原型,其中le表示小印地安字节序,be表示大印地安字节序。注意编译器并不强制严格的数据类型化,因为大多数函数都是预处理宏;下面给出的类型仅供参考。
__u16 cpu_to_le16(__u16 cpu_val); __u32 cpu_to_le32(__u32 cpu_val); __u16 cpu_to_be16(__u16 cpu_val); __u32 cpu_to_be32(__u32 cpu_val); __u16 le16_to_cpu(__u16 le_val); __u32 le32_to_cpu(__u32 le_val); __u16 be16_to_cpu(__u16 be_val); __u32 be32_to_cpu(__u32 be_val);
这些函数在处理二进制数据流时很有用(例如文件系统数据或存在接口板中的信息),这些函数在处理二进制数据流时很有用(例如文件系统数据或存在接口板中的信息),版本2.1.43又增加了两个新的转换函数集。这些集允许你用指针获取一个值,或是对参数指定的一个值进行就地转换。对应与16位小印地安字节序的函数又如下的原型;类似的函数对其它类型的整数也存在,导致一共16个函数。
__u16 cpu_to_le16p(__u16 *addr) __u16 le16_to_cpup(__u16 *addr) void cpu_to_le16s(__u16 *addr) void le16_to_cpus(__u16 *addr)
“p”函数类似与指针的复引用,但在需要时转换这个值;“s”函数可以在原地转换一个值的印地安字节序(例如,cpu_to_le16s(addr) 和addr=cpu_to_le16(*addr)完成的工作是一样的)。
这些函数也在sysdep-2.1.h中定义了。为了避免双重解释的副作用,这个头文件用线入函数,而不是预处理宏。
vremap<b></b> vremap
“把握内存”中“vmalloc和朋友们”一节描述的vremap函数在版本2.1中得到一个新名字。新函数ioremap只是名字变了,它与旧的remap取同样的参数。响应的释放函数是iounmap,它代替vfree来释放被重映射的地址。这个改变是为了明确这个函数的实际作用:将I/O空间重映射到核心空间的一个虚地址。头文件sysdep-2.1.h强化了这种新规则,当在2.0版本编译时,它#define了ioremap和iounmap到它们2.0的对应者。
虚拟内存
|