technorati 標籤:
current thread_info
在核心中,可以通過current巨集來獲得當前執行程序的task_struct指標。現在來簡要分析以下:
最原始的定義如下:
#define current get_current()
#define get_current() (current_thread_info()->task)
可以看出,current呼叫了 current_thread_info函式,此函式的核心路徑為: arch/arm/include/asm/thread_info.h,核心版本為2.6.32.65
static inline struct thread_info *current_thread_info(void)
其中 thread_info結構體如下:
struct thread_info ;
當核心執行緒執行到此處時,其sp堆疊指標指向呼叫程序所對應的核心執行緒的棧頂。通過 sp & ~(thread_size-1)向上對齊,達到棧底部。如下圖所示
將結果強制型別轉換為thread_info型別,此型別中有乙個成員為task_struct,它就是 當前正在執行程序的 task_struct指標。
備註:在核心中,程序的task_struct是由slab分配器來分配的,slab分配器的優點是物件復用和快取著色。
聯合體:
#define thread_size 8192 //核心執行緒棧 可以通過核心配置成4k 或者 8k ,此處是8k 。在x86體系結構上,32位的核心棧為8k,64位的為16k。
union thread_union ;
整個8k的空間,頂部供程序堆疊使用,最下部為thread_info。從使用者態切換到核心態時,程序的核心棧還是空的,所以sp暫存器指向棧頂,一旦有資料寫入,sp的值就會遞減,核心棧按需擴充套件,理論上最大可擴充套件到 【8192- sizeof(thread_info) 】大小,考慮到函式的現場保護,往往不會有這麼大的棧空間。核心在代表程序執行時和所有的中斷服務程式執行時,共享8k的核心棧。
浩天之家
出處: 頂
top
收藏 關注
分類:
linux 核心程式設計
好文要頂
關注我收藏該文
浩天之家
關注 - 0
粉絲 - 19
+加關注 0 0
人與人之間的交往藝術
ieee 802.15.4協議學習之mac層
posted @ 2015-01-28 14:09
收藏
核心中的current巨集
說明 current巨集,是乙個全域性指標,指向當前程序的struct task struct結構體,即表示當前程序。例如current pid就能得到當前程序的pid,current comm就能得到當前程序的名稱。每個程序會有兩個棧,乙個使用者棧,存在於使用者空間,乙個核心棧,存在於核心空間。當...
核心巨集定義
參考 例如 include include define string hello world i love u n int main 執行結果 helloworld i love u 分割線因為對於乙個大程式而言,我們可能要定義很多常量 不管是放在原始檔還是標頭檔案 那麼我們有時考慮定義某個常量時...
核心MKDEV MAJOR, MINOR 巨集
版本 linux 2.6.24.4 巨集 mkdev major,minor 說明 獲取裝置在裝置表中的位置。major 主裝置號 minor 次裝置號 核心使用的版本號說明檔案 在核心 documentation 目錄下的 devices.txt 有說明。一般本地保留的 major 234 239...