程序是執行期間的程式及其它所包含的資源的總稱。
程序通過fork()系統調用産生,該系統調用通過複制一個現有程序來建立一個全新的程序。fork()調用一次傳回兩次:一次回到父程序、一次回到新建立的子程序。
程序描述符及任務結構
核心把程序放在task list的雙向循環連結清單中,其中每一項都是一個task_struct結構(即程序描述符)。task_struct結構比較大(32位機器上約1.7K),包含了核心管理程序所需的全部資訊。
Linux通過slab配置設定器配置設定task_struct結構,以達到對象複用和緩存着色的目的。
每個程序通過pid來辨別,預設最大值為32768,可以通過/proc/sys/kernel/pid_max修改。
thread_info結構
struct thread_info {
struct task_struct *task; /* main task structure */
struct exec_domain *exec_domain; /* execution domain */
unsigned long flags; /* low level flags */
unsigned long status; /* thread-synchronous flags */
__u32 cpu ; /* current CPU */
int preempt_count ; /* 0 => preemptable, <0 => BUG */
mm_segment_t addr_limit ; /* thread address space:
0-0xBFFFFFFF for user-thead
0-0xFFFFFFFF for kernel-thread
*/
void *sysenter_return;
struct restart_block restart_block ;
unsigned long previous_esp; /* ESP of the previous stack in case
of nested (IRQ) stacks
__u8 supervisor_stack [0];
};
該結構在核心棧的尾端配置設定。
如何查找目前正在運作程序的程序描述符
為什麼要屏蔽掉低13位(當THREAD_SIZE為8192時):
核心中的棧是從高位址到低位址,thread_info和核心棧(核心态堆棧)共享同一塊記憶體, 而每個任務的thread_info在核心棧的尾端配置設定.
本文轉自feisky部落格園部落格,原文連結:http://www.cnblogs.com/feisky/archive/2012/04/05/2433253.html,如需轉載請自行聯系原作者