LKD这本书虽然看过很多遍,但在工作中却发现一些小知识点却容易被忽略,包括自己在内,因此有必须把一些小知识点再强化小结一下。
1、字长
能够由机器一次处理完成的数据被称为字。某处理器多少“位”,通常指的就是它的字长。
出于某些历史和主观原因,一些操作系统根据数据长度把数据划分为字节(8位)、字(16位)、双字(32位)、四字(64位)。
2、char的符号问题
C标准里char类型可以带符号或不带符号,由编译器或处理器决定。大部分体系上,char默认是带符号的,但在ARM处理器上,char是不带符号的。比如当char默认不带符号时,
char i = -1;
它实际上把255赋给了i(整数在内存里是以补码的形式存放的,正数的补码是它本身,负数的补码是取绝对值,取反再加1)
3、字节顺序
大端big-endian:高字节存在内存低地址,低字节存在内存高地址。
小端little-endian:高字节存在内存高低址,低字节存在内存低地址。
ARM和i386都是小端字节顺序。
下面例字可以判断机器的字节顺序:
int x = 1;
if(* (char *) &x == 1)
/*小端字节顺序*/
else
/*大端字节顺序*/
(*和&运算符的优先级相同,但按自在右向左的方向结合)
4、内核里的时间
不要假定内核中断发生的频率,应该使用HZ来计量时间,计量时间的正确方法是乘或除以HZ,比如
HZ,2*HZ,HZ/2,HZ/1O