主要有4個數據結構
task_union(sched.c第53行)
//這實際上是一頁內存,頁面低端頭部放的是task_struct(進程控制塊)結構,頁面
//其他部分當作進程的內核態堆棧使用
union task_union {
struct task_struct task;
char stack[PAGE_SIZE];
};
task[NR_TASKS](sched.c第65行)
//task_struct指針數組,每個進程的task_struct指針都保存在這個數組中。雖然指針類型是//task_struct*,但實際上指向的是一頁內存,其中包括了進程的內核態堆棧。
// task[0]以及被手工初始化成init_task
struct task_struct * task[NR_TASKS] = {&(init_task.task), };
tss_struct(sched.h第53行)
//任務段數據,與80386的tss結構對應
struct tss_struct {
long back_link; /* 16 high bits zero */
long esp0;
long ss0; /* 16 high bits zero */
long esp1;
long ss1; /* 16 high bits zero */
long esp2;
long ss2; /* 16 high bits zero */
long cr3;
long eip;
long eflags;
long eax,ecx,edx,ebx;
long esp;
long ebp;
long esi;
long edi;
long es; /* 16 high bits zero */
long cs; /* 16 high bits zero */
long ss; /* 16 high bits zero */
long ds; /* 16 high bits zero */
long fs; /* 16 high bits zero */
long gs; /* 16 high bits zero */
long ldt; /* 16 high bits zero */
long trace_bitmap; /* bits: trace 0, bitmap 16-31 */
struct i387_struct i387;
};
task_struct(sched.c第80行)
// 進程控制塊
struct task_struct {
/*-----------------------these are hardcoded - don't touch -----------------------*/
long state; //進程運行狀態(-1不可運行,0可運行,>0以停止)
long counter; //任務運行時間片,遞減到0是說明時間片用完
long priority; //任務運行優先數,剛開始是counter=priority
long signal; //任務的信號位圖,信號值=偏移+1
struct sigaction sigaction[32]; //信號執行屬性結構,對應信號將要執行的操作和標志信息
long blocked; //信號屏蔽碼
/*-----------------------------------various fields--------------------------------- */
int exit_code; //任務退出碼,當任務結束時其父進程會讀取
unsigned long start_code,end_code,end_data,brk,start_stack;
// start_code 代碼段起始的線性地址
//end_code 代碼段長度
//end_data 代碼段長度+數據段長度
//brk 代碼段長度+數據段長度+bss段長度
// start_stack 堆棧段起始線性地址
long pid,father,pgrp,session,leader;
// pid 進程號
// father 父進程號
// pgrp 父進程組號
// session 會話號
// leader 會話首領
unsigned short uid,euid,suid;
// uid 用戶標id
// euid 有效用戶id
// suid 保存的用戶id
unsigned short gid,egid,sgid;
// gid 組id
// egid 有效組id
// sgid 保存組id
long alarm; //報警定時值
long utime,stime,cutime,cstime,start_time;
// utime 用戶態運行時間
//stime 內核態運行時間
//cutime 子進程用戶態運行時間
//cstime 子進程內核態運行時間
//start_time 進程開始運行時刻
unsigned short used_math; //標志,是否使用了387協處理器
/*----------------------------------file system info-------------------------------- */
int tty; //進程使用tty的子設備號,-1表示沒有使用
unsigned short umask; //文件創建屬性屏蔽碼
struct m_inode * pwd; //當前工作目錄的i節點
struct m_inode * root; //根目錄的i節點
struct m_inode * executable; //可執行文件的i節點
unsigned long close_on_exec; //執行時關閉文件句柄位圖標志
struct file * filp[NR_OPEN]; //進程使用的文件
/*------------------ldt for this task 0 - zero 1 - cs 2 - ds&ss -------------------*/
struct desc_struct ldt[3]; //本任務的ldt表,0-空,1-代碼段,2-數據和堆棧段
/*---------------------------------tss for this task---------------------------------*/
struct tss_struct tss; //本任務的tss段
};
進程在線性地址空間的分布(start_code,end_code,end_data,brk,start_stack):
?
評論
查看更多