主要有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行)
<!--@page { margin: 0.79in }P { margin-bottom: 0.08in }A:link { so-language: zxx }-->
//task_struct指针数组,每个进程的task_struct指针都保存在这个数组中。虽然指针类型是
//task_struct*,但实际上指向的是一页内存,其中包括了进程的内核态堆栈。
// task[0]以及被手工初始化成init_task
struct task_struct * task[NR_TASKS] ={&(init_task.task), };
<!--@page { margin: 0.79in }P { margin-bottom: 0.08in }-->
tss_struct(sched.h第53行)
<!--@page { margin: 0.79in }P { margin-bottom: 0.08in }-->
//任务段数据,与80386的tss结构对应
struct tss_struct {
longback_link;/* 16 high bits zero*/
longesp0;
longss0;/* 16 high bits zero */
longesp1;
longss1;/* 16 high bits zero */
longesp2;
longss2;/* 16 high bits zero */
longcr3;
longeip;
longeflags;
longeax,ecx,edx,ebx;
longesp;
longebp;
longesi;
longedi;
longes;/* 16 high bits zero */
longcs;/* 16 high bits zero */
longss;/* 16 high bits zero */
longds;/* 16 high bits zero */
longfs;/* 16 high bits zero */
longgs;/* 16 high bits zero */
longldt;/* 16 high bits zero */
longtrace_bitmap;/* bits: trace 0,bitmap 16-31 */
struct i387_struct i387;
};
<!--@page { margin: 0.79in }P { margin-bottom: 0.08in }-->
task_struct(sched.c第80行)
<!--@page { margin: 0.79in }P { margin-bottom: 0.08in }-->
// 进程控制块
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 sigactionsigaction[32];//信号执行属性结构,对应信号将要执行的操作和标志信息
long blocked;//信号屏蔽码
/*-----------------------------------various fields--------------------------------- */
int exit_code;//任务退出码,当任务结束时其父进程会读取
unsigned longstart_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;//报警定时值
longutime,stime,cutime,cstime,start_time;
//utime用户态运行时间
//stime内核态运行时间
//cutime子进程用户态运行时间
//cstime子进程内核态运行时间
//start_time进程开始运行时刻
unsigned short used_math;//标志,是否使用了387协处理器
/*----------------------------------file systeminfo-------------------------------- */
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段
};
<!--@page { margin: 0.79in }P { margin-bottom: 0.08in }-->
进程在线性地址空间的分布(start_code,end_code,end_data,brk,start_stack):