11.2. 安排一個(gè)明確大小給數(shù)據(jù)項(xiàng)

2018-02-24 15:50 更新

11.2.?安排一個(gè)明確大小給數(shù)據(jù)項(xiàng)

有時(shí)內(nèi)核代碼需要一個(gè)特定大小的數(shù)據(jù)項(xiàng), 也許要匹配預(yù)定義的二進(jìn)制結(jié)構(gòu),[39] 來(lái)和用戶空間通訊, 或者來(lái)用插入"填充"字段來(lái)對(duì)齊結(jié)構(gòu)中的數(shù)據(jù)( 但是關(guān)于對(duì)齊問題的信息參考 "數(shù)據(jù)對(duì)齊" 一節(jié) ).

內(nèi)核提供了下列數(shù)據(jù)類型來(lái)使用, 無(wú)論你什么時(shí)候需要知道你的數(shù)據(jù)的大小. 所有的數(shù)據(jù)聲明在 <asm/types.h>, 它又被 <linux/types.h> 包含.


u8; /* unsigned byte (8 bits) */
u16; /* unsigned word (16 bits) */
u32; /* unsigned 32-bit value */
u64; /* unsigned 64-bit value */

存在對(duì)應(yīng)的有符號(hào)類型, 但是很少需要; 如果你需要它們, 只要在名子里用 s 代替 u.

如果一個(gè)用戶空間程序需要使用這些類型, 可用使用一個(gè)雙下劃線前綴在名子上: u8 和其它獨(dú)立于 KERNEL 定義的類型. 例如, 如果, 一個(gè)驅(qū)動(dòng)需要與用戶空間中運(yùn)行的程序交換二進(jìn)制結(jié)構(gòu), 通過 ioctl, 頭文件應(yīng)當(dāng)在結(jié)構(gòu)中聲明 32-位 成員為 u32.

重要的是記住這些類型是 Linux 特定的, 并且使用它們妨礙了移植軟件到其他的 Unix 口味上. 使用近期編譯器的系統(tǒng)支持 C99-標(biāo)準(zhǔn) 類型, 例如 uint8_t 和 uint32_t; 如果考慮到移植性, 使用這些類型比 Linux-特定的變體要好.

你可能也注意到有時(shí)內(nèi)核使用傳統(tǒng)的類型, 例如 unsigned int, 給那些維數(shù)與體系無(wú)關(guān)的項(xiàng). 這是為后向兼容而做的. 當(dāng) u32 和它的類似物在版本 1.1.67 引入時(shí), 開發(fā)者不能改變存在的數(shù)據(jù)結(jié)構(gòu)為新的類型, 因?yàn)榫幾g器發(fā)出一個(gè)警告當(dāng)在結(jié)構(gòu)成員和安排給它的值之間有一個(gè)類型不匹配時(shí).. Linus 不希望他寫給自己使用的操作系統(tǒng)稱為多平臺(tái)的; 結(jié)果是, 老的結(jié)構(gòu)有時(shí)被松散的鍵入.

事實(shí)上, 編譯器指示類型不一致, 甚至在 2 個(gè)類型只是同一個(gè)對(duì)象的不同名子, 例如在 PC 上 unsigned long 和 u32.

[39] 這發(fā)生在當(dāng)讀取分區(qū)表時(shí), 當(dāng)執(zhí)行一個(gè)二進(jìn)制文件時(shí), 或者當(dāng)解碼一個(gè)網(wǎng)絡(luò)報(bào)文時(shí).

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)