說明:current巨集,是乙個全域性指標,指向當前程序的struct task_struct結構體,即表示當前程序。
例如current->pid就能得到當前程序的pid,current-comm就能得到當前程序的名稱。
每個程序會有兩個棧,乙個使用者棧,存在於使用者空間,乙個核心棧,存在於核心空間。
當程序在使用者空間執行時,cpu堆疊指標暫存器裡面的內容是使用者堆疊位址,使用使用者棧;
當程序在核心空間時,cpu堆疊指標暫存器裡面的內容是核心棧空間位址,使用核心棧。
在陷入核心後,系統呼叫中也是存在函式呼叫和自動變數,這些都需要棧支援。、
當程序因為中斷或者系統呼叫而陷入核心態時,程序所使用的堆疊也要從使用者棧轉到核心棧。
程式一:urrent巨集的使用
建立資料夾/nfsroot/kern/2012-04-16/01/。
建立檔案/nfsroot/kern/2012-04-16/01/test.c,內容如下:
說明:要使用current巨集,必須宣告標頭檔案linux/sched.h。
上面的test_exit()函式的返回值應改為void。
建立檔案/nfsroot/kern/2012-04-16/01/makefile,內容如下:
在主機端編譯模組,過程如下:
在開發板端載入和解除安裝模組,過程如下:
說明:模組執行的時候,有兩種形式:
第一種,代表其他應用程式在執行,稱作程序上下文。主要是通過程式呼叫模組實現的。
第二種,代表中斷在執行,稱作中斷上下文。主要是通過(外部)硬體中斷呼叫模組實現的。
顯然,現在此模組是通過程式呼叫的,屬於程序上下文。
可見current巨集的使用效果表面,current就表示當前程序。
載入模組的時候,代表insmod程式在執行,所以列印出來的程式名為insmod。
解除安裝模組的時候,代表rmmod程式在執行,所以列印出來的程式名為rmmod。
程式二:實現自己的current。
參考文件:
每個程序執行的時候,都會分配8k的核心棧,此核心棧的分配是按8k對齊的,核心棧頂放置乙個struct thread_info thread_info的結構體,而thread_info裡面有個struct task_struct *task的指標,指向代表當前程序的task_struct。當程序呼叫模組的時候,模組宣告的所有區域性變數就會在此程序的核心棧中有乙份,所以即使多個程序呼叫同乙個模組,也不會造成混淆。
如果我們要獲得當前程序的current巨集,只要隨便定義個區域性變數,然後把其位址按8k對齊(即把低13bit置0),就能得到thread_info的位址,則其task指標即為current!
分析核心**如何獲取current:
current --> get_current() --> current_thread_info() --> sp & ~(thread_size - 1),過程如下:
1static inline struct task_struct *get_current(void)2
56#define current (get_current())
1static inline struct thread_info *current_thread_info(void)2
1自己實現current巨集:#define thread_size 8192
2#define thread_start_sp (thread_size - 8)
修改上面的檔案/nfsroot/kern/2012-04-16/01/test.c,內容如下:
在主機端重新編譯模組,過程如下:
在開發板端,載入和解除安裝模組,過程如下:
說明:可見mycurrent和current的輸出完全一致,表示我們實現的自己的current巨集了。
最後說明:
current巨集定義在,但通過就可以使用current巨集。
thread_info結構體和彙編級操作函式定義在。
task_struct結構定義在中。
核心current巨集解析
technorati 標籤 current thread info 在核心中,可以通過current巨集來獲得當前執行程序的task struct指標。現在來簡要分析以下 最原始的定義如下 define current get current define get current current t...
linux核心中ffs x 巨集
linux核心中ffs x 巨集是平台相關的巨集,在arm平台,該巨集定義在 arch arm include asm bitops.h define ffs x static inline int fls int x t t 等於找到 t 第乙個為1的位 從低位開始 並把該位保留為1其餘位清0.例...
linux核心中的list entry巨集
初學linux核心 將學習中的一些知識點儲存起來,方便以後查閱。define list entry ptr,type,member container of ptr,type,member list entry只是一層封裝,實際上起作用的是container of巨集,define containe...