核心中的current巨集

2021-07-03 06:37:09 字數 2564 閱讀 1869

說明: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),過程如下:

1

static inline struct task_struct *get_current(void)2

56#define current (get_current())

1

static inline struct thread_info *current_thread_info(void)2

1

#define thread_size 8192

2#define thread_start_sp (thread_size - 8)

自己實現current巨集:

修改上面的檔案/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...