在2.1的开发中,有些Linux内部被修改了。新核心提供了对内部锁的很好的管理;通过使用几个细粒度的锁,而不是全局的锁,竞争条件被避免了,这样也获得了更好的性能----特别是SMP配置下。更细的锁机制的一个结果是intr_count不再存在了。2.1.34抛弃了这个全局变量,而布尔函数in_interrupt可以取而代之(这个函数从2.1.30开始存在)。目前,in_interrupt是在头文件中声明的宏,这个头文件又包含在中。头文件sysdep-2.1.h用intr_count的名义定义了in_interrupt以获得对2.0的向后兼容性。
注意虽然in_interrupt是个整数,intr_count却是个unsigned long,因此,如果你想打印这个值,并在2.0和2.1间可移植,你必须强制将这个值转换为一个显式的类型,并在调用printk时指定一个合适的格式。在2.1.37中中断管理又引入了一个不同:快和慢中断处理程序不再存在了。SA_INTERRUPT不被新版本的request_irq使用,但它在处理程序执行以前仍然控制着中断是否被打开。如果几个处理程序共享一个中断线,每个可以是个不同的“类型”。中断打开与否依赖于第一个被调用的处理程序。当中断处理程序存在时,下半部总是执行。
位操作
2.1.37稍微改变了在中定义的位操作的作用。现在函数set_bit及其相关者返回void,而新的类似test_and_set_bit的函数已被引入。新的函数集有如下原型:
void set_bit(int nr, volatile void * addr); 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的对应者。