Linux0.11内核--进程相关数据结构
2011-03-20 17:26
726 查看
主要有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 {
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_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 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):
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 {
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_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 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):
相关文章推荐
- Linux0.11内核--进程相关数据结构
- Linux2.6内核--VFS层中和进程相关的数据结构
- linux路由内核实现分析(二)---FIB相关数据结构(4)
- linux路由内核实现分析(二)---FIB相关数据结构
- Linux0.11内核--内存组织和进程结构
- Linux0.11内核--内存组织和进程结构
- Linux0.11内核--内存组织和进程结构
- linux路由内核实现分析(二)---FIB相关数据结构(1)
- Linux0.11内核--内存组织和进程结构 http://blog.csdn.net/x_white/article/details/8459611
- linux路由内核实现分析(二)---FIB相关数据结构(2)
- linux路由内核实现分析(二)---FIB相关数据结构(3)
- 内存管理器(九)内核内存管理–进程相关数据结构
- 简单谈一点linux内核中套接字的bind机制--数据结构以及端口确定
- linux 内核常用数据结构及算法——list(循环双向链表)
- 对linux 0.11版本内核中进程创建fork()的理解
- 深入LInux内核结构学习笔记---进程表示
- Linux2.6内核--VFS层中和进程相关的数据结构
- Linux0.11内核--内核空间、用户空间之间的数据传输
- linux 0.11 内核学习 -- sched.c,调度进程。
- 第四十七篇:Linux中的USB XHCI HOST TRANSFER RING的相关数据结构 (2)