Linux TCP/IP协议栈的通用编码模式解析
但是,每次内核读写ip头中超过一个字节的变量时,它都必须首先将网络字节序转换成主机字节序或是相反。这个原则同样适用于TCP/IP协议栈中的其他协议。如果网络字节序和本机字节序一致,转换函数就执行一个空操作,因为它们之间不需要转换。这样做可以提高代码的可移植性,因为这种情况下,只有转换函数是与平台相关的。
表1列出了转换两字节和四字节变量时用到的函数:
Table 1. Byte-ordering conversion routines Macro
Meaning (short is 2 bytes, long is 4 bytes)
htons
Host-to-network byte order (short)
htonl
Host-to-network byte order (long)
ntohs
Network-to-host byte order (short)
ntohl
Network-to-host byte order (long)
这些宏的定义放在include/linux/byteorder/generic.h头文件中。下面是每个平台如何把本平台的存储格式与这些宏的定义关联起来的:
每个平台相关的目录下include/asm-XXX/,都有一个文件byteorder.h。
这个文件包含include/linux/byteorder/big_endian.h和include/linux/byteorder/little_endian.h两个文件中的一个,具体包含哪个,与处理器的存储格式有关
little_endian.h和big_endian.h两个文件都包含通用文件 include/linux/byteorder/generic.h。表1中的宏的定义依赖于little_endian.h和 big_endian.h中定义的宏,这样,不同平台的存储格式就会影响到表1中定义的宏。
表1中定义的每个宏xxx都有一个与之对应的宏__constant_xxx,用于转换常量的存储格式,例如,一个枚举类型的元素。值得注意的是,表1中的宏是通用的宏,不管它的输入值是常量还是变量。
我们前面说过,存储格式对超过一个字节的数据项非常重要。存储格式对超过一个字节的位域定义同样非常重要。例如,IPV4的头部定义。内核使用_ LITTLE_ENDIAN_BITFIELD和_ _BIG_ENDIAN_BITFIELD两个条件编译参数来控制数据结构的定义,这两个条件在前面所述的
little_endian.h和big_endian.h两个文件中定义。
12. Catching Bugs
追踪有些函数只能在某种条件下调用,或者不能在某种条件下调用。内核使用BUG_ON和BUG_TRAP宏来捕获那些未满足条件的函数调用。如果BUG_TRAP的输入值是false
, 内核打印一段告警信息。而BUG_ON会打印一段出错信息并且使内核崩溃。
13. Statistics
在实现某项功能时,统计某个特定条件出现的次数是个好习惯。比如统计缓存命中和失败的次数,内存分配成功和失败的次数等。本书会列出并描述每一个在网络代码中出现的统计变量。
14. 计时
内核经常需要测量从某个给定时刻开始经过了多长时间。例如,某个cpu使用量大的任务通常会在给定的时间段后释放cpu。如果被重新调度后,它会继续运行。这对内核程序非常重要,虽然linux内核支持内核抢占。网络代码中,一个常见的例子就是实现垃圾收集的例程。
内核空间中时间用时钟嘀哒来计量。一个嘀哒是两个连续的时钟中断之间的时间隔。时钟处理不同的任务(在这里,我们不关注它们),并且每秒发生HZ次。HZ是一个体系结构相关的变量。例如,如果在i386机器上把它初始化为1000,就意味着每秒发生1000次时钟中断,并且两个连续中断之间的时间隔是1毫秒。
每一次时钟中断都会把全局变量jiffies加一。这就意味着,在任何时刻,jiffies代表从开机到现在所发生的嘀哒的数量,并且n*HZ值一般都表示n秒。
如果一个函数需要测量时间隔,它可以把当前的jiffies值保存到一个局部变量中,然后把这个值与后续时刻的jiffies相比较以求得它们之间的差值。通过这个差值(两个时刻间的嘀哒数量)就可以计算出从计时开始经过了多长时间。
下面的例子展示了一个函数,它需要执行一些任务,但是它占用cpu的时间不能超过一个嘀哒数。当do_something完成时,它把job_done置为一个非零值,然后函数就可以返回了:
unsigned long start_time = jiffies;
int job_done = 0;
do {
do_something(&job_done);
If (job_done)
return;
while (jiffies - start_time < 1);


















文章评论
共有 位CH网友发表了评论 查看完整内容