關(guān)于linux內核的可移植性我不用多說(shuō),現在的linux操作系統,你裝系統時(shí)應該很明白的知道了,很少說(shuō)(至少我沒(méi)見(jiàn)到)不兼容不能裝的問(wèn)題。今天就來(lái)說(shuō)說(shuō)這個(gè)問(wèn)題:
1.字節和數據類(lèi)型
能夠由機器一次就完成處理的數據被稱(chēng)為字,字指位的數目。所以我們常聽(tīng)到機器是多少位的時(shí)候,就是指該機的字長(cháng)。處理器通用寄存器的大小和它的字長(cháng)是相同的。C語(yǔ)言定義的long類(lèi)型總對等于機器字長(cháng)。對于支持的每一種體系結構,Linux都要將<asm/types.h>中的BITS_PER_LONG定義為C long類(lèi)型的長(cháng)度,也就是系統的字長(cháng)。不透明類(lèi)型是那些通過(guò)typeder聲明的類(lèi)型。另外就是,我們常常需要在程序中使用長(cháng)度明確的類(lèi)型,內核在asm/types.h中定義了這些長(cháng)度明確的類(lèi)型,而該文件又被包含在文件linux/types.h中,如下表所示:

其中帶符號的變量用的比較少。接下來(lái)是char型:分為有符號(-128~127)和無(wú)符號(0~255).
2.數據對齊
如果一個(gè)變量的內存地址正好是它長(cháng)度的整數倍,它就被稱(chēng)為自然對齊的。關(guān)于字節對齊的內容還是相當繁瑣的,我這里就不細講了,后面我會(huì )有專(zhuān)門(mén)的專(zhuān)題來(lái)說(shuō)這個(gè)問(wèn)題。
3.字節順序
字節順序是指在一個(gè)字中各個(gè)字節的順序。處理器在對字取值時(shí)既可能將最低有效位所在字節當作第一個(gè)字節(最左邊的字節),也可能將其當作最后一個(gè)字節(最右邊的字節)。如果最高有效位所在的字節放在最高字節位置上,其他字節依次放在低字節位置上,那么該字節順序稱(chēng)作高位優(yōu)先(big-endian)[存放左大右小],否則就叫做little-endian[左小又大].直接舉個(gè)例子,如下:
00000000 00000000 00000100 00000011

下面是上述數據在兩種不同字節序的排列方式:

雖然不習慣,但確實(shí)是這樣的,使用高位優(yōu)先的體系結構把最高字節位存放在最小的內存地址上。下邊的代碼可以判定給定的機器字節對齊類(lèi)型:
1 2 3 4 5 | int x = 1;if (*(char *)&x == 1) /* little endian */else /* big endian */ |
在linux內核支持的每一種體系結構,相應的內核都會(huì )根據機器使用的字節順序在它的asm/byteorder.h中定義__BIG_ENDIAN或__LITTILE_ENDIAN中的一個(gè)。,這個(gè)頭文件還從include/linux/byteord
er中包含了一組宏命令完成字節順序之間的相互轉換,最常用的宏命令如下:
1 2 3 4 | u23 __cpu_to_be32(u32); /* convert cpu's byte order to big-endian */u32 __cpu_to_le32(u32); /* convert cpu's byte order to little-endian */u32 __be32_to_cpu(u32); /* convert big-endian to cpu's byte order */u32 __le32_to_cpus(u32); /* convert little-endian to cpu's byte order */ |
4.時(shí)間
關(guān)于內核的時(shí)間問(wèn)題,絕對不要假定時(shí)鐘中斷發(fā)生的頻率,也就是每秒產(chǎn)生的jiffies數目。相反,應該使用HZ來(lái)正確計量時(shí)間。
5.頁(yè)長(cháng)度
當處理用頁(yè)管理的內存時(shí),絕對不要假設頁(yè)的長(cháng)度。不同的體系結構使用頁(yè)的長(cháng)度也是不一樣的。當處理用頁(yè)組織管理的內存時(shí),通過(guò)PAGE_SIZE來(lái)使用以字節數來(lái)表示的頁(yè)長(cháng)度,而PAGE_SHIFT這個(gè)值定義了從最右端屏蔽多少位能夠得到該地址對應的頁(yè)的頁(yè)號。
總之,編寫(xiě)可移植的代碼需要考慮許多問(wèn)題:字長(cháng),數據類(lèi)型,對齊,字節次序,頁(yè)大小,處理器排序等等。
關(guān)于linux內核的可移植性我不用多說(shuō),現在的linux操作系統,你裝系統時(shí)應該很明白的知道了,很少說(shuō)(至少我沒(méi)見(jiàn)到)不兼容不能裝的問(wèn)題。今天就來(lái)說(shuō)說(shuō)這個(gè)問(wèn)題:
1.字節和數據類(lèi)型
能夠由機器一次就完成處理的數據被稱(chēng)為字,字指位的數目。所以我們常聽(tīng)到機器是多少位的時(shí)候,就是指該機的字長(cháng)。處理器通用寄存器的大小和它的字長(cháng)是相同的。C語(yǔ)言定義的long類(lèi)型總對等于機器字長(cháng)。對于支持的每一種體系結構,Linux都要將<asm/types.h>中的BITS_PER_LONG定義為C long類(lèi)型的長(cháng)度,也就是系統的字長(cháng)。不透明類(lèi)型是那些通過(guò)typeder聲明的類(lèi)型。另外就是,我們常常需要在程序中使用長(cháng)度明確的類(lèi)型,內核在asm/types.h中定義了這些長(cháng)度明確的類(lèi)型,而該文件又被包含在文件linux/types.h中,如下表所示:

其中帶符號的變量用的比較少。接下來(lái)是char型:分為有符號(-128~127)和無(wú)符號(0~255).
2.數據對齊
如果一個(gè)變量的內存地址正好是它長(cháng)度的整數倍,它就被稱(chēng)為自然對齊的。關(guān)于字節對齊的內容還是相當繁瑣的,我這里就不細講了,后面我會(huì )有專(zhuān)門(mén)的專(zhuān)題來(lái)說(shuō)這個(gè)問(wèn)題。
3.字節順序
字節順序是指在一個(gè)字中各個(gè)字節的順序。處理器在對字取值時(shí)既可能將最低有效位所在字節當作第一個(gè)字節(最左邊的字節),也可能將其當作最后一個(gè)字節(最右邊的字節)。如果最高有效位所在的字節放在最高字節位置上,其他字節依次放在低字節位置上,那么該字節順序稱(chēng)作高位優(yōu)先(big-endian)[存放左大右小],否則就叫做little-endian[左小又大].直接舉個(gè)例子,如下:
00000000 00000000 00000100 00000011

下面是上述數據在兩種不同字節序的排列方式:

雖然不習慣,但確實(shí)是這樣的,使用高位優(yōu)先的體系結構把最高字節位存放在最小的內存地址上。下邊的代碼可以判定給定的機器字節對齊類(lèi)型:
1 2 3 4 5 | int x = 1;if (*(char *)&x == 1) /* little endian */else /* big endian */ |
在linux內核支持的每一種體系結構,相應的內核都會(huì )根據機器使用的字節順序在它的asm/byteorder.h中定義__BIG_ENDIAN或__LITTILE_ENDIAN中的一個(gè)。,這個(gè)頭文件還從include/linux/byteord
er中包含了一組宏命令完成字節順序之間的相互轉換,最常用的宏命令如下:
1 2 3 4 | u23 __cpu_to_be32(u32); /* convert cpu's byte order to big-endian */u32 __cpu_to_le32(u32); /* convert cpu's byte order to little-endian */u32 __be32_to_cpu(u32); /* convert big-endian to cpu's byte order */u32 __le32_to_cpus(u32); /* convert little-endian to cpu's byte order */ |
4.時(shí)間
關(guān)于內核的時(shí)間問(wèn)題,絕對不要假定時(shí)鐘中斷發(fā)生的頻率,也就是每秒產(chǎn)生的jiffies數目。相反,應該使用HZ來(lái)正確計量時(shí)間。
5.頁(yè)長(cháng)度
當處理用頁(yè)管理的內存時(shí),絕對不要假設頁(yè)的長(cháng)度。不同的體系結構使用頁(yè)的長(cháng)度也是不一樣的。當處理用頁(yè)組織管理的內存時(shí),通過(guò)PAGE_SIZE來(lái)使用以字節數來(lái)表示的頁(yè)長(cháng)度,而PAGE_SHIFT這個(gè)值定義了從最右端屏蔽多少位能夠得到該地址對應的頁(yè)的頁(yè)號。
總之,編寫(xiě)可移植的代碼需要考慮許多問(wèn)題:字長(cháng),數據類(lèi)型,對齊,字節次序,頁(yè)大小,處理器排序等等。
聯(lián)系客服