核心current巨集解析

2021-09-05 12:04:35 字數 1493 閱讀 4294

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...