可移植的操作系統盡可能少的涉及與機器相關的代碼,為了支持不同的體系結構,界面和功能在定義時盡最大可能的有普遍性和抽象性。一個一致性非常高而本身有比較簡單的操作系統在支持新的體系結構時,可能只需修改很少量的代碼,但是可能會存在與體系結構相關的功能無法使用的現象。Linux在可移植性方面使用了折中的路線,差不多所有的接口和核心代碼都是獨立于硬件結構的C語言代碼,但對于性能要求嚴格的部分,內核的特性會根據不同的硬件體系進行調整。
可移植性的另一個關鍵問題就是數據類型,本書對于系統結構在可移植性方面分析的較少,相對更多的注意力放在了這里。
對于支持的每一種體系結構,Linux都要將<asm/types.h>中的BITS_PER_LONG定義為Clong類型的長度,也就是系統字長,下面是linux的系統字長對照表。linux移植的一般過程、
Table 19.1 Supported Linux Architectures
Architecture?????????????????????? Description????????????????????????? Word Size
alpha ????????????????????? ? ? ? ? ?? Digital Alpha??????????????????????? 64 bits
arm???????????????????????????????????? ARM and StrongARM???????? 32 bits
avr ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? AVR ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 32 bits
blackfin ? ? ? ? ? ? ? ? ? ? ? ? ? ? Blackfin????????????????????????????????? 32 bits
cris??????????????????????????????????? CRIS?????????????????????????????????????? 32 bits
frv?????????????????????????????????????? FR-V??????????????????????????????????????? 32 bits
h8300??????????????????????????????? H8/300?????????????????????????????????? 32 bits
ia64 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? IA-64?????????????????????????????????????? 64 bits
m32r ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? M32xxx??????????????????????????????????? 32 bits
m68k ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? Motorola 68k???????????????????????? 32 bits
m68knommu???????????????????? m68k without MMU ? ? ? ? ?? 32bits
mips ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? MIPS??????????????????????????????????????? 32 and 64 bits
parisc HP???????????????????????? PA-RISC ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 32 and 64bits
powerpc?????????????????????????? PowerPC????????????????????????????????? 32 and 64 bits
s390 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? IBM S/390 ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 32 and 64 bits
Sh Hitachi SH 32 bits
Sparc SPARC 32 and 64 bits
xtensa Xtensa 32 bits
牢記下面的規則:
ANSI C標準規定,一個char的長度一定是1個字節;
盡管沒有規定int類型的長度是32bit,但是linux當前所有支持的體系結構中,它都是32位的;
short類型也類似,在當前所有支持的體系結構中,雖然沒有明確規定,但都是16bit的;
絕對不應該假定指針和long的長度,在Linux當前支持的體系結構中,他們可以在32bit和64bit間變換;
由于不同的體系結構的long長度不同,不應該假設sizeof(int) = sizeof(long );
類似的,不要假設指針和int長度相等;
不透明類型隱藏著他的內部格式或結構,開發者利用typedef聲明一個類型,把它叫做不透明類型。
處理不透明類型是的原則:
不要假設類型的長度。這些類型在某些系統中可能是32bit,而在其他系統中又可能是64bit,并且,內核開發者可以任意修改這些類型的大小;
不要將該類型轉化回對應的C標準類型使用;
編程時要保證在該類型實際存儲空間和格式發生變化時代碼不受影響;
char型的符號問題
大部分體系結構上,默認char是帶符號的,它可以從-128到127之間取值。但是也有例外,比如ARM結構,char就是不帶符號的,他的取值范圍是0-255.
因此,如果在自己的代碼中使用了char型,要保證帶符號和不帶符號的情況下代碼都沒問題。如果能明確使用的哪一種,就直接聲明它。linux移植到arm教程。
數據對齊
對齊是跟數據塊在內存中的位置相關的話題,如果一個變量的內存地址正好是他的長度的整數倍,他就稱作是自然對齊。
編譯器會同過讓所有的數據自然對齊來避免引發對齊問題。實際上,內核開發者在對齊上不用話費太多心思。
但了解一些也終歸是好的嘛。
舉個例子,將一個指向char型的指針當作指向unsignedlong型的指針用,會引起問題,因為此時會試圖從一個并不能被4或8整除的內存地址上載入32或64位的unsignedlong型數據。go移植linux內核書名叫啥,
非標準C數據類型按照下面原則對齊:
對于數組,只要按照基本數據類型進行對齊就可以,隨后的所有元素自然能夠對齊;
對于聯合體,只要它包含的長度的最大數據類型能夠對齊就可以;
對于結構體,只要結構體每一個元素能夠正確對齊就可以;
結構體的填補
為了保證每一個成員能夠自然對齊,結構體要被填補。
例:
struct animal_struct {
???? char dog;??? /* 1 byte */
????unsigned long cat;????/* 4 bytes */
????unsigned short pig;????/* 2 bytes */
????char fox;????/* 1 byte */
};
在編譯時為了滿足各成員自然對齊,它在內存中不是按原樣存放的。編譯后:
struct animal_struct {
????char dog; ????/*1 byte */
????u8 __pad0[3];????/*3 byte */
????unsigned long cat;????/*4 byte */
????unsigned short pig;????/*2 byte */
????char fox;????/*1 byte */
????u8 __pad1;????/*1 byte */
};
note:在大部分32bit系統上,對于任何這樣一個結構體,sizeof(animal_struct)返回都是12.
當然可以通過重新排列結構體來避免填充:
struct animal_struct {
????unsigned long cat;????/*4 byte */
????unsigned short pig;????/*3 byte */
????char dog;????/*1 byte */
????char fox;????/*1 byte */
};
但是不是任何時候都可以對結構體進行調整,如果結構體是某個標準的一部分(比如USB),或是它是現有代碼,它的成員次序就已經定死。
注意,ANSIC明確規定不允許編譯器改變結構體內成員對象的次序—他是有程序員決定的。
字節順序
如果最高有效位所在的字節放在低字節位置上,其他字節依次放在高字節位置上,那么該字節順序稱作高位優先(big-endian)。kvm是基于linux內核實現的、如果最低有效位所在的字節放在高字節位置上,其他字節依次存放在低字節位置上,那么就稱做低位優先(little-endian)。
舉個例子,如何判斷是大端還是小端:
int x = 1;
if (*(char *)&x == 1)
????/* little endian */
else
????/* big endian */
對于Linux支持的每一種體系結構,相應的內核都會根據機器使用的字節順序在他的<asm/byteorder.h>中定義__BIG_ENDIAN或__LITTLE_ENDIAN中的一個。
這個頭文件還從include/linux/byteorder/中包含了一組宏命令用于完成字節順序之間的相互轉換,命令包括:
u23 __cpu_to_be32(u32);????/*convertcpu’s byte order to big-endian */
u32 __cpu_to_le32(u32);???? /*convertcpu’s byte order to little-endian */
u32 __be32_to_cpu(u32);???? /*convertbig-endian to cpu’s byte order */
u32 __le32_to_cpus(u32);???? /*convertlittle-endian to cpu’s byte order */
時間的計算
正確計量時間應該使用HZ,而不是jiffies。HZ定義在<asm/param.h>
最后一點就是關于頁長度的問題,處理頁管理內存時,絕對不要假設頁的長度,不同體系結構的頁長度見下表:
Table 19.4Architecture Page Size(s)
Architecture ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? PAGE_SHIFT???????????????????????????? PAGE_SIZE
alpha???????????????????????????????????????????? 13????????????????????????????????????????????????? 8KB
arm ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 12, 14, 15???????????????????????????????????? 4KB, 16KB, 32KB
avr ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 12?????????????????????????????????????????????????? 4KB
cris???????????????????????????????????????????????? 13?????????????????????????????????????????????????? 8KB
blackfin ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 12?????????????????????????????????????????????????? 4KB
frv??????????????????????????????????????????????????? 14?????????????????????????????????????????????????? 16KB
h8300???????????????????????????????????????????? 12????????????????????????????????????????????????? 4KB
???????????????????????????????????????????????????????? 12, 13, 14, 16????????????????????????????? 4KB, 8KB, 16KB,64KB
m32r ???????????????????????????????????????????? 12 ?????????????????????????????????????????????????? 4KB
m68k ?????????????????????????????????????????? ? 12, 13 ??????????????????????????????????????????? 4KB, 8KB
m68knommu ?????????????????????????????? 12 ????????????????????????????????????????????????? 4KB
mips ?????????????????????????????????????????? ?? 12 ?????????????????????????????????????????? ? ? ?? 4KB
mn10300???????????????????????????????????? ? 12 ????????????????????????????????????????????????? 4KB
parisc ??????????????????????????????????????????? 12 ?????????????????????????????????????????????????? 4KB
powerpc ?????????????????????????????????????? 12 ??????????????????????????????????????????????????? 4KB
s390?????????????????????????????????????????? ?? 12 ??????????????????????????????????????????????????? 4KB
sh ????????????????????????????????????????????????? 12 ?????????????????????????????????????????? ? ? ? ?? 4KB
sparc ??????????????????????????????????????????? 12, 13 ????????????????????????????????????????????? 4KB, 8KB
um ??????????????????????????????????????????????? 12 ???????????????????????????????????????????????????? 4KB
x86 ??????????????????????????????????????????????? 12 ???????????????????????????????????????????????????? 4KB
xtensa ???????????????????????????????????????????12 ???????????????????????????????????????????????????? 4KB
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态