W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
盡管大部分程序員習(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)核中使用.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: