Linux裝置驅動模型學習之基礎中的基礎篇

2021-06-09 03:32:47 字數 1864 閱讀 7818

1、  typeof

typeof並非iso c的關鍵字,而是gcc對c的乙個擴充套件。typeof是乙個關鍵字(類似sizeof),用於獲取乙個表示式的型別。

舉個簡單的例子:

char tt;

typeof(tt) cc;

則typeof(tt)等價於char,即相當於宣告了char cc;

2、  offsetof

位置:用途:獲取結構型別type裡的 成員member 在結構體內的偏移

分析:#define offsetof(type, member) ((size_t) &((type *)0)->member)

假設有結構體uio_mem:

struct uio_mem

;如果想獲得成員memtype在uio_mem內的偏移,那麼該怎麼做呢?

很簡單,只要使用offsetof(struct uio_mem, memtype)就可以了。

可以將上述表示式展開為:

(size_t) &(( struct uio_mem *)0)-> memtype

( struct uio_mem *)0將0強制轉換為struct uio_mem的指標,記為p = ( struct uio_mem *)0,p是指向struct uio_mem的指標,值為0。而p->memtype則指向struct uio_mem的成員memtype,再取位址&(p->memtype),這樣就得到了成員memtype的位址。由於結構體基位址p為0,所以&(p->memtype)就是相對於p的偏移了。最後再把成員的位址強制轉換為size_t,其實就是轉換為int。

typedef __kernel_size_t  size_t;

typedef unsigned int __kernel_size_t;

此例中offsetof(struct uio_mem, memtype) = sizeof(struct kobject) + sizeof(unsigned long) + sizeof(unsigned long)

參考:3、  container_of

位置:用途:通過指向成員member的指標ptr,獲取包含該成員的結構體type的指標

分析:#define container_of(ptr, type, member) ()

假設有結構體uio_mem:

struct uio_mem

;現有指向uio_mem的成員memtype的指標p(因此p的型別為int *),那麼如何獲取結構體uio_mem的指標?恭喜你,答對了,使用container_of(p, struct uio_mem, memtype)。

將該巨集展開為:

const typeof( ((struct uio_mem *)0)-> memtype) *__mptr = (p);// 1

(struct uio_mem *)( (char *)__mptr - offsetof(struct uio_mem, memtype) ); // 2

根據之前的分析,可以很容易理解語句1等價於:

const int *__mptr = p;

即__mptr指向uio_mem的成員memtype,也即__mptr是uio_mem的成員memtype的位址。那麼如果我們知道memtype在struct uio_mem中的偏移的話,用memtype的位址減去這個偏移不就知道結構體uio_mem的「首」位址了嗎?

根據上述分析,通過offsetof(struct uio_mem, memtype)獲取memtype在struct uio_mem中的偏移,然後再用memtype的實際位址(也即__mptr)減去這個偏移,這樣就得到了結構體uio_mem的位址了,最後再將uio_mem的位址強制轉換為struct uio_mem *,就獲得了結構體uio_mem的指標了,這就是上述語句2所做的事情。

linux裝置驅動模型 學習

裝置驅動分類 證明linux 一切皆檔案 思想 dev 目錄 存放裝置所對應的檔案 目錄下的每乙個檔案對應乙個裝置 linux是乙個樹型結果,沒有分割槽概念 比如 sda1 就對應在跟目錄下 linux裝置驅動模型 匯流排 裝置 與平台相關,平台資訊,移植是改這個部分 驅動 是跨平台的,不需要任何改...

Linux驅動之裝置模型 3

4 小結 4.1 kobject,kset和ktype kobject,kset和ktype就三個結構體,但是卻很容易讓人混淆,是由於它們內部相互交織。l kobject,是裝置模型中的基本物件,包含了引用計數,父子關係,目錄項等,通常會嵌入到其它的資料結構中,使其也具有kobject的特性 l k...

Linux驅動之裝置模型 5

6 裝置 6.1 裝置 l linux裝置模型中每乙個裝置用device結構來表示 struct device 6.2 裝置屬性 l 裝置屬性由device attribute來表示 structdevice attribute device attr name,mode,show,store l ...