2010年9月10日 星期五

What is be32_to_cpu/cpu_to_be32(),cpu_to_le16(),cpu_to_le32(),

be32_to_cpu/cpu_to_be32(),cpu_to_le16(),cpu_to_le32(),

le 叫做Little Endian,be 叫做Big Endian,這是兩種字節序.
le 就表示地址地位存儲值的低位,地址高位存儲值的高位.
be 就表示地址低位存儲值的高位,地址高位存儲值的低位.
我們就以這裡這個臨時變量c 為例.假設c 是這樣被存儲在內存地址0x0000 開始的地方:

0x0000 0x12
0x0001 0x34
0x0002 0xab
0x0003 0xcd

如果你是採用le 的字節序,那麼讀出來的值就是0xcdab3412,
反之,如果你採用的是be 的字節序,那麼讀出來的值就是0x1234abcd.
同樣的,如果你把0x1234abcd 寫入0x0000 開始的內存中,那麼結果就是:

big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12

為什麼這幾個函數名字裡面都一個”cpu”?
談到字節序不談cpu 那就好比神采飛揚的談起超級女聲卻對張靚穎是何許人也茫然不知.
不同的cpu 採用不同的字節序.看生產商自己喜歡了.
其中,big endian 以Motolora 的PowerPC 系列cpu 為代表,
而little endian 則以我家Intel 的x86 系列cpu 為代表.
所以這幾個函數名字裡邊都會有cpu 的字樣,
那麼毫無疑問對於不同的cpu,這幾個函數執行的代碼是不一樣的.
但是,凡是xx_to_cpu 就說明函數的結果是給cpu 使用的,
反之如果是cpu_to_xx 就說明是從cpu 的字節序轉換成目標字節序.