11.2. 安排一個明確大小給數(shù)據(jù)項

2018-02-24 15:50 更新

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

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

內核提供了下列數(shù)據(jù)類型來使用, 無論你什么時候需要知道你的數(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 */

存在對應的有符號類型, 但是很少需要; 如果你需要它們, 只要在名子里用 s 代替 u.

如果一個用戶空間程序需要使用這些類型, 可用使用一個雙下劃線前綴在名子上: u8 和其它獨立于 KERNEL 定義的類型. 例如, 如果, 一個驅動需要與用戶空間中運行的程序交換二進制結構, 通過 ioctl, 頭文件應當在結構中聲明 32-位 成員為 u32.

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

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

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

[39] 這發(fā)生在當讀取分區(qū)表時, 當執(zhí)行一個二進制文件時, 或者當解碼一個網絡報文時.

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號