在linux核心原始碼中,經常要對鍊錶進行操作,其中乙個很重要的巨集是list_for_each_entry:
意思大體如下:
假設只有兩個結點,則第乙個member代表head,
list_for_each_entry的作用就是迴圈遍歷每乙個pos中的member子項。
巨集list_for_each_entry:
list_entry((head)->next, typeof(*pos), member)返回(head)->next物理指標所處位置向前減去offsetof()個位元組資料之後, 其父變數pos的實體地址,父變數的型別在編譯時由typeof(*pos)自動返回.
所以list_for_each_entry遍歷head下面掛接的型別為typeof(*pos)的childs結構體們,當然每個child結構體包含struct list_head node之類相似的雙向鍊錶list_head型別項,就這樣通過迴圈pos將依次指向雙向鍊錶上的各個child.(member就是child型別中被定義的變數名)
其中用到了函式list_entry():
和函式prefetch:
其中用到了builtin_prefetch:
prefetch的含義是告訴cpu那些元素有可能馬上就要用到,告訴cpu預取一下,這樣可以提高速度
其中用到了函式container_of():
下面這個鏈結講container_of的作用,很詳細了:
其中又用到了offsetof()函式:
lxr上找到的原始碼:
offsetof(type, member)
該巨集在linux核心**(版本2.6.22)中定義如下:
#define offsetof(type, member) ((size_t) &((type *)0)->member);
分析:(type *)0,將 0 強制轉換為 type 型指標,記 p = (type *)0,p是指向type的指標,它的值是0。那麼 p->member 就是 member 這個元素了,而&(p->member)就是menber的位址,而基位址為0,這樣就巧妙的轉化為了type中的偏移量。再把結果強制轉 換為size_t型的就ok了,size_t其實也就是int。
typedef __kernel_size_t size_t;
typedef unsigned int __kernel_size_t;
可見,該巨集的作用就是求出member在type中的偏移量。
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...
linux核心中的list entry巨集
初學linux核心 將學習中的一些知識點儲存起來,方便以後查閱。define list entry ptr,type,member container of ptr,type,member list entry只是一層封裝,實際上起作用的是container of巨集,define containe...