11.1. 標(biāo)準(zhǔn) C 類型的使用

2018-02-24 15:50 更新

11.1.?標(biāo)準(zhǔn) C 類型的使用

盡管大部分程序員習(xí)慣自由使用標(biāo)準(zhǔn)類型, 如 int 和 long, 編寫設(shè)備驅(qū)動需要一些小心來避免類型沖突和模糊的 bug.

這個問題是你不能使用標(biāo)準(zhǔn)類型, 當(dāng)你需要"一個 2-字節(jié) 填充者"或者"一個東西來代表一個4-字節(jié) 字串", 因為正常的 C 數(shù)據(jù)類型在所有體系上不是相同大小. 為展示各種 C 類型的數(shù)據(jù)大小, datasize 程序已包含在例子文件 misc-progs 目錄中, 由 O' Reilly's FTP 站點提供. 這是一個程序的樣例運行, 在一個 i386 系統(tǒng)上(顯示的最后 4 個類型在下一章介紹):


morgana% misc-progs/datasize
arch Size: char short int long ptr long-long u8 u16 u32 u64
i686       1    2     4   4    4   8         1  2   4   8

這個程序可以用來顯示長整型和指針在 64-位 平臺上的不同大小, 如同在不同 Linux 計算機(jī)上運行程序所演示的:


arch  Size:  char  short  int  long  ptr long-long  u8 u16 u32 u64 
i386         1     2      4    4     4   8          1  2   4   8  
alpha        1     2      4    8     8   8          1  2   4   8  
armv4l       1     2      4    4     4   8          1  2   4   8  
ia64         1     2      4    8     8   8          1  2   4   8  
m68k         1     2      4    4     4   8          1  2   4   8  
mips         1     2      4    4     4   8          1  2   4   8  
ppc          1     2      4    4     4   8          1  2   4   8  
sparc        1     2      4    4     4   8          1  2   4   8  
sparc64      1     2      4    4     4   8          1  2   4   8  
x86_64       1     2      4    8     8   8          1  2   4   8  

注意有趣的是 SPARC 64 體系在一個 32-位 用戶空間運行, 因此那里指針是 32 位寬, 盡管它們在內(nèi)核空間是 64 位寬. 這可用加載 kdatasize 模塊(在例子文件的 misc-modules 目錄里)來驗證. 這個模塊在加載時使用 printk 來報告大小信息, 并且返回一個錯誤( 因此沒有必要卸載它 ):


kernel: arch Size: char short int long ptr long-long u8 u16 u32 u64
kernel: sparc64    1    2     4   8    8   8         1  2   4   8

盡管在混合不同數(shù)據(jù)類型時你必須小心, 有時有很好的理由這樣做. 一種情況是因為內(nèi)存存取, 與內(nèi)核相關(guān)時是特殊的. 概念上, 盡管地址是指針, 內(nèi)存管理常常使用一個無符號的整數(shù)類型更好地完成; 內(nèi)核對待物理內(nèi)存如同一個大數(shù)組, 并且內(nèi)存地址只是一個數(shù)組索引. 進(jìn)一步地, 一個指針容易解引用; 當(dāng)直接處理內(nèi)存存取時, 你幾乎從不想以這種方式解引用. 使用一個整數(shù)類型避免了這種解引用, 因此避免了 bug. 因此, 內(nèi)核中通常的內(nèi)存地址常常是 unsigned long, 利用了指針和長整型一直是相同大小的這個事實, 至少在 Linux 目前支持的所有平臺上.

因為其所值的原因, C99 標(biāo)準(zhǔn)定義了 intptr_t 和 uintptr_t 類型給一個可以持有一個指針值的整型變量. 但是, 這些類型幾乎沒在 2.6 內(nèi)核中使用.

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號