主要有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):