linux核心中的list entry巨集

2021-05-22 09:09:22 字數 896 閱讀 6616

初學linux核心**,將學習中的一些知識點儲存起來,方便以後查閱。

#define list_entry(ptr, type, member) /

container_of(ptr, type, member)

list_entry只是一層封裝,實際上起作用的是container_of巨集,

#define container_of(ptr, type, member) ()

#define container_of(ptr, type, member)  /

( / /

)可以看到,首先是使用typeof(gcc的擴充套件)獲取到member成員的型別,用來定義乙個

與ptr型別相同的const指標__mptr,之後將ptr賦值給__mptr,然後(char *)__mptr

將指標轉為char*型別,這樣在後續的操作中會按照1位元組來處理,offsetof巨集可以用來獲取

member在type結構中的偏移值,

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

首先0被轉為(type *)型別,相當於0位址處的乙個type型別的指標,然後引用這個指標的member

成員,最後取member成員的位址,由於type型別的指標位於0位址處,取member成員的位址後就

得到了member成員在type型別中的位址偏移值,最後轉為size_t型別。

在container_of中,(char *)__mptr - offsetof(type,member) ,即member成員的位址 - member

成員相當於type結構的位址偏移值,就能夠得到type結構的首位址,最後將這一位址轉為(type*)型別,

大功告成!

Linux核心中的list for each

在linux核心原始碼中,經常要對鍊錶進行操作,其中乙個很重要的巨集是list for each entry 意思大體如下 假設只有兩個結點,則第乙個member代表head,list for each entry的作用就是迴圈遍歷每乙個pos中的member子項。巨集list for each e...

Linux核心中的Namespace

linux核心中的namespace提供了乙個輕量級的基於系統呼叫層面的虛擬化解決方案。相比傳統的使用 vmware,qemu,xen,kvm,hurd的虛擬 圖1所示 基於namespace的輕量級虛擬具有易使用,易管理,無需硬體虛擬化支援,低 成本等優點。圖 1.namespace又稱conta...

linux核心中的 config

經過make menuconfig 生成 config 決定哪些驅動編譯到核心,哪些驅動編譯為模組 那為什麼呢?舉個例子分析一下 eg 在.config 中有 config dm9000 y grep config dm9000 r 1.c檔案中 arch arm mach s5pv210 mach...