欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
linux內核分析筆記----內核可移植性

      關(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è)大小,處理器排序等等。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
數據恢復系列教程(一)知識儲備
跨平臺移植性問(wèn)題
編譯內核 報錯 -mlittle-endian
基本數據類(lèi)型
ECS Linux CentOS 7如何修改內核啟動(dòng)順序
linux多核cpu編程, 用哪個(gè)函數獲得cpu內核數目?
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久