linux内核博大精深,Linux Kernel里的cpu_to_le32是干啥的?
8種機械鍵盤軸體對比
本人程序員,要買一個寫代碼的鍵盤,請問紅軸和茶軸怎么選?
在kernel里面經常能看見把十六進制數用下面幾個函數轉換一下,比如be32_to_cpu, cpu_to_be32, cpu_to_le16,cpu_to_le32等.其實很簡單.
名詞解釋
le叫做little endian, be叫做big endian,這是兩種字節序,分別稱為小段和大端.
le表示地址低為存儲值的低位,地址高位存儲值的高位.
be表示地址低位存儲值的高位,地址高位存儲值的低位.
不用cpu使用了不同的字節序,比如PowerPC系列cpu就用了大端模式,而ARM和x86就用的小端模式.
因此,對于不用的cpu,上面幾個函數的執行結果也是不一樣的.
但是,凡是xx_to_cpu就說明結果是給cpu使用的.反之,cpu_to_xx就說明從cpu的字節序轉換成目標字節序.
如果cpu本身就是小端模式,那么cput_to_le32這類函數就會do nothing.
如何實現
下面以cpu_to_le32為例,看看內核是如何轉換的.
//generic.h#define cpu_to_le32 __cpu_to_le32//cpu如果是小端模式,do nothing#define __cpu_to_le32(x) ((__force __le32)(__u32)(x))//cpu如果是大端模式,交換#define __cpu_to_le32(x) ((__force __le32)__swab32((x)))
/**
* __swab32 - return a byteswapped 32-bit value
* @x: value to byteswap
*/
#define __swab32(x)
(__builtin_constant_p((__u32)(x)) ?
___constant_swab32(x) :
__fswab32(x))
//通過與運算和位移操作實現高低位交換操作#define ___constant_swab32(x) ((__u32)(
(((__u32)(x) & (__u32)0x000000ffUL) << 24) |
(((__u32)(x) & (__u32)0x0000ff00UL) << 8) |
(((__u32)(x) & (__u32)0x00ff0000UL) >> 8) |
(((__u32)(x) & (__u32)0xff000000UL) >> 24)))
kernel真是博大精深,一直以來都是專心調驅動,對這些細節還從來沒仔細研究過,當仔細看過之后,不得不佩服Kernel的contributor確實牛逼啊.
總結
以上是生活随笔為你收集整理的linux内核博大精深,Linux Kernel里的cpu_to_le32是干啥的?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [云炬小程序实战笔记] 第1章 全新版:
- 下一篇: 拼装机器人感想_机器人心得体会(2019