您的位置:首页 > 理论基础 > 数据结构算法

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

2011-03-20 17:26 726 查看
主要有4个数据结构

task_union
sched.c53行)

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

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

union task_union {

struct task_struct task;

char stack[PAGE_SIZE];

};



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



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

tss_structsched.h53行)

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

//
任务段数据,与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;

};

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

};

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

进程在线性地址空间的分布(start_code,end_code,end_data,brk,start_stack):

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: