主要有4個數(shù)據(jù)結(jié)構(gòu)
task_union(sched.c第53行)
//這實(shí)際上是一頁內(nèi)存,頁面低端頭部放的是task_struct(進(jìn)程控制塊)結(jié)構(gòu),頁面
//其他部分當(dāng)作進(jìn)程的內(nèi)核態(tài)堆棧使用
union task_union {
struct task_struct task;
char stack[PAGE_SIZE];
};
task[NR_TASKS](sched.c第65行)
//task_struct指針數(shù)組,每個進(jìn)程的task_struct指針都保存在這個數(shù)組中。雖然指針類型是//task_struct*,但實(shí)際上指向的是一頁內(nèi)存,其中包括了進(jìn)程的內(nèi)核態(tài)堆棧。
// task[0]以及被手工初始化成init_task
struct task_struct * task[NR_TASKS] = {&(init_task.task), };
tss_struct(sched.h第53行)
//任務(wù)段數(shù)據(jù),與80386的tss結(jié)構(gòu)對應(yīng)
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行)
// 進(jìn)程控制塊
struct task_struct {
/*-----------------------these are hardcoded - don't touch -----------------------*/
long state; //進(jìn)程運(yùn)行狀態(tài)(-1不可運(yùn)行,0可運(yùn)行,>0以停止)
long counter; //任務(wù)運(yùn)行時間片,遞減到0是說明時間片用完
long priority; //任務(wù)運(yùn)行優(yōu)先數(shù),剛開始是counter=priority
long signal; //任務(wù)的信號位圖,信號值=偏移+1
struct sigaction sigaction[32]; //信號執(zhí)行屬性結(jié)構(gòu),對應(yīng)信號將要執(zhí)行的操作和標(biāo)志信息
long blocked; //信號屏蔽碼
/*-----------------------------------various fields--------------------------------- */
int exit_code; //任務(wù)退出碼,當(dāng)任務(wù)結(jié)束時其父進(jìn)程會讀取
unsigned long start_code,end_code,end_data,brk,start_stack;
// start_code 代碼段起始的線性地址
//end_code 代碼段長度
//end_data 代碼段長度+數(shù)據(jù)段長度
//brk 代碼段長度+數(shù)據(jù)段長度+bss段長度
// start_stack 堆棧段起始線性地址
long pid,father,pgrp,session,leader;
// pid 進(jìn)程號
// father 父進(jìn)程號
// pgrp 父進(jìn)程組號
// session 會話號
// leader 會話首領(lǐng)
unsigned short uid,euid,suid;
// uid 用戶標(biāo)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 用戶態(tài)運(yùn)行時間
//stime 內(nèi)核態(tài)運(yùn)行時間
//cutime 子進(jìn)程用戶態(tài)運(yùn)行時間
//cstime 子進(jìn)程內(nèi)核態(tài)運(yùn)行時間
//start_time 進(jìn)程開始運(yùn)行時刻
unsigned short used_math; //標(biāo)志,是否使用了387協(xié)處理器
/*----------------------------------file system info-------------------------------- */
int tty; //進(jìn)程使用tty的子設(shè)備號,-1表示沒有使用
unsigned short umask; //文件創(chuàng)建屬性屏蔽碼
struct m_inode * pwd; //當(dāng)前工作目錄的i節(jié)點(diǎn)
struct m_inode * root; //根目錄的i節(jié)點(diǎn)
struct m_inode * executable; //可執(zhí)行文件的i節(jié)點(diǎn)
unsigned long close_on_exec; //執(zhí)行時關(guān)閉文件句柄位圖標(biāo)志
struct file * filp[NR_OPEN]; //進(jìn)程使用的文件
/*------------------ldt for this task 0 - zero 1 - cs 2 - ds&ss -------------------*/
struct desc_struct ldt[3]; //本任務(wù)的ldt表,0-空,1-代碼段,2-數(shù)據(jù)和堆棧段
/*---------------------------------tss for this task---------------------------------*/
struct tss_struct tss; //本任務(wù)的tss段
};
進(jìn)程在線性地址空間的分布(start_code,end_code,end_data,brk,start_stack):
?
評論
查看更多