Linux的可移植性
不顾可移植性,尽可能多地使用汇编代码。
linux在可移植性上,走的是中间路线,所有接口和核心代码都是用的c语言,但是对于性能要求高的部分都会根据硬件进行调整。
体系结构
说到计算机的体系结构,具体包含计算机的指令集架构,处理器组织,总线结构,存储体系结构等。
即软硬件。
字长
当人们说某个机器是多少位时,说的就是字长。
处理器寄存器的大小和它的字长是一样的。
对于一个体系结构,它的各个部位(比如内存总线)最少也要和它的字长一样大。
虚拟空间的大小取决于字长
虚拟地址空间的大小决定了一个程序能够寻址的内存数量,但实际上物理内存的大小可能比虚拟地址空间小得多。字长决定了虚拟地址空间的最大大小。
Linux的一些可移植性准则
一个char的长度一定是1字节。
尽管没有规定int类型的长度是32位,但在linux当前支持的所有体系中,都是32位的。
尽管没有规定short类型的长度为16位,但在linux当前支持的所有体系中,都是16位的。
不应该假定long和指针的长度,在linux现在支持的体系中,它们可能是32位或者64位的。
char型的符号问题
C标准表示char类型可以带符号也可以不带符号,有具体的处理器和编译器决定。
在大部分体系结构上,char默认是带符号的(-128到127)。
保险就是
signed char i = -1;
unsigned char = 255;
数据对齐
数据对齐是指在计算机中,数据在内存中存储时按照一定规则排列的过程。通常,数据类型有特定的字节对齐要求,以便在访问内存时提高效率。
常见的对齐规则包括:
- 字节对齐(Byte Alignment): 数据存储的起始地址必须是其字节大小的整数倍。
- 字对齐(Word Alignment): 数据存储的起始地址必须是字的整数倍。
通常数据对齐是gcc老哥需要考虑的。
字节(字节是最小单位)顺序:大端小端
大端序(Big-Endian)
先读高位字节。
小端序(Little-Endian)
先读低位字节。
eg。
00000000 0000000 00000100 00000011
大端先读0000000
小端先读0000011