程序描述符: struct_task,定義於,程序的task_struct存放在程序核心棧的尾端.
把task_struct結構與核心棧放在一起的好處:核心中大部分處理程序的**都是通過程序描述符進行的。 因而current巨集查詢到當前程序的描述符的速度就尤為重要。對於暫存器不富裕的體系結構來說,通過預先分配和重複使用task_struct可以避免動態分配和釋放所帶來的資源消耗,unix的乙個特點就是建立程序迅速。
在intel系統中,棧起始於末端(棧底),並朝棧底的方向增長。從使用者態剛切換到核心態以後,程序的核心棧總是空的,因此,esp暫存器直接指向這個記憶體區的頂端。從使用者態切換到核心態後,esp暫存器包含的位址為0x018fc00。程序描述符存放在從0x015fa00開始的位址。只要把資料寫進棧中,esp的值就遞減。
在/include/linux/sched.h中定義了如下乙個聯合結構:
union task_union ;
從這個結構可以看出,核心棧佔8kb的記憶體區。實際上,程序的task_struct結構所佔的記憶體是由核心動態分配的,更確切地說,核心根本不給task_struct分配記憶體,而僅僅給核心棧分配8k的記憶體,並把其中的一部分給task_struct使用。
task_struct結構大約佔1k位元組左右,其具體數字與核心版本有關,因為不同的版本其域稍有不同。因此,核心棧的大小不能超過7k,否則,核心棧會覆蓋
task_struct結構,從而導致核心崩潰。
kernel利用current裡尋找task_struct的位置,假設棧的大小為8k(13個二進位制位),我們可以將程序棧的位址的後13位遮蔽掉,這樣得到的剛好就是程序棧的起
始位址,而thread_info剛好就是位於程序棧的底部,所以程序棧的起始位址就是struct thread_info的位址,得到了thread_info的位址,我們就很容易找到
task_struct的位址了。
彙編實現過程為
movl %-9162 ,%eax
andl %esp ,%eax
暫存器esp存放程序棧的當前位址,eax最後存放的就是程序棧的起始位址。current使用current_thread_info來實現這個過程。
linux-3.14.12 核心分析:
#define get_current() (current_thread_info()->task)
#define current get_current()
/* how to get the thread information struct from c */
static inline struct thread_info *current_thread_info(void)
#define current_stack_pointer ()
arch/x86/include/asm/page_32_types.h:
#define thread_size_order 1
#define thread_size (page_size << thread_size_order)
arch/x86/include/asm/page_types.h:
#define page_shift 12
#define page_size (_ac(1,ul) << page_shift)
include/linux/sched.h:
union thread_union ;
Linux 程序描述符
linux程序管理 1 程序描述符 程序描述符 linux使用程序描述符資料結構記錄現場資訊,然後給予程序描述符管理程序,包括程序的建立 排程 消亡等操作。程序除了包括執行著的程式,還包括系統資源 當前cpu現場 排程資訊 程序間關係等 記錄這些執行緒資訊的資料結構就是程序描述符task struc...
mysql 檔案描述符 檔案描述符
toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...
檔案描述符
檔案描述符 是個很小的正整數,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。檔案描述符的優點 相容posix標準,許多 linux 和unix 系統呼叫都依賴於它。檔案描述符的缺點 不能移植到unix以外的系統上去,也不直觀。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案...