Linux0.11内核--进程相关数据结构

时间:2021-05-12 21:17:27

主要有4个数据结构

task_unionsched.c53行)

 

//这实际上是一页内存,页面低端头部放的是task_struct(进程控制块)结构,页面

//其他部分当作进程的内核态堆栈使用

union task_union {

struct task_struct task;

char stack[PAGE_SIZE];

};

Linux0.11内核--进程相关数据结构

 

task[NR_TASKS]sched.c65行)

 

<!--@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), };

Linux0.11内核--进程相关数据结构

<!--@page { margin: 0.79in }P { margin-bottom: 0.08in }-->

tss_structsched.h53行)

 

 

 

<!--@page { margin: 0.79in }P { margin-bottom: 0.08in }-->

//任务段数据,与80386tss结构对应

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_structsched.c80行)

 

<!--@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;//任务运行优先数,刚开始是counterpriority

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;

// gidid

// 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_codeend_codeend_databrkstart_stack):

Linux0.11内核--进程相关数据结构