Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103654199
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-04-29 09:36:22

作者:陈莉君   来自:

1.时间
绝对不要假定时钟中断发生的频率,也就是每秒产生的jiffies数目。相反,应该使用Hz来正确计量时间。这一点至关重要,因为不但不同的体系结构之间定时中断的频率不同,即使是在同一种体系机构上,两个不同版本的内核之间这种频率也不尽相同。
举个例子,在x86系统上,Hz设定为1000。也就是说,定时中断每秒发生1000次,也就是每毫秒一次。可是在2.6版以前,x86上Hz定为100。而其他体系机构上的数值各不相同:alpha的Hz是1024而ARM的Hz是100。
绝对不要用jiffies直接去和1000这样的数值去比较,认为这样做大体上不会出问题是要不得的。计量时间的正确方法是乘以或除以Hz。比如:
HZ          /* 1秒 */
(2*HZ)      /* 2秒 */
(HZ/2)      /* 半秒 */
(HZ/100)        /* 10毫秒 */
(2*HZ/100)      /* 20毫秒 */
HZ定义在文件中。

2.  页长度
当处理用页管理的内存时,绝对不要假设页的长度。在x86下编程的程序员往往错误地认为一页的大小就是4KB。尽管x86机器上使用的页确实是4KB,但是其他不同的体系结构使用的页长度可能不同。实际上有些体系结构还同时支持多种不同长度的页。表4列举了各种体系结构使用的页的长度。
当处理用页组织管理的内存时,通过PAGE_SIZE来使用以字节数来表示的页长度。而PAGE_SHIFT这个值定义了从最右端屏蔽多少位能够得到该地址对应的页的页号。举例来说,在页长为4KB的x86机上,PAGE_SIZE为4096而PAGE_SHIFT为12。它们都定义于中。

表4   不同体系结构的页长度

体系结构      PAGE_SHIFT         PAGE_SIZE
alpha          13                8KB
arm           12,14,15         4KB,16KB,32KB
cris          13               8KB
h8300         12               4KB
i386          12               4KB
ia64          12,13,14,16     4KB, 8KB, 16KB, 64KB
m32r          12               4KB
m68k          12,13            4KB, 8KB
m68knommu     12               4KB
mips          12               4KB
mips64        12               4KB
parisc        12               4KB
ppc          12               4KB
ppc64         12               4KB
s390          12               4KB
sh            12               4KB
sparc         12,13           4KB, 8KB
sparc64      13               8KB
v850          12               4KB
x86_64        12               4KB

3. 处理器排序

有些处理器严格限制指令排序,代码指定的所有装载或存储指令都不能被重新排序;而另外一些体系结构对排序要求则很弱,可以自行排序指令序列。
    在代码中,如果在对排序要求最弱的体系结构上,要保证指令执行顺序。那么就必须使用诸如rmb()和wmb()等恰当的内存屏障来确保处理器以正确顺序提交装载和存储指令。详情请参见《LDK》第9章。
4.SMP、内核抢占、高端内存
在讨论可移植性的地方加入有关并发处理、内核抢占和高端内存的部分看起来似乎不太恰当。毕竟,这些都不是会影响到操作系统的硬件之间有所差异的那些特性,恰恰相反,它们都是Linux内核本身的一些功能,硬件体系结构根本感知不到它们的存在。但是,它们代表的其实都是可配置的重要选项,而你的代码应该充分考虑到对它们的支持。就是说,只有在编程时就针对SMP/内核抢占/高端内存进行了考虑,你的代码才会无论内核怎样配置,都能身处安全之中。再在前面那些保证可移植性的规范下加上这几条:
* 假设你的代码会在SMP系统上运行,要正确地选择和使用锁。
* 假设你的代码会在支持内核抢占的情况下运行,要正确地选择和使用锁和内核抢占语句。
* 假设你的代码会运行在使用高端内存(非永久映射内存)的系统上,必要时使用kmap()。
阅读(192) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~