linux0.11中的进程

来源:互联网 发布:wall control软件下载 编辑:程序博客网 时间:2024/05/16 06:19

《linux内核设计的艺术》书中提到,“操作系统最难和最有价值的是它的整体,整体看明白了,局部才能清楚。”本章讲一下linux0.11中进程的一些整体情况,希望对大家有一些帮助。

一、首先,Linux0.11中进程如此安排,达到的效果便是:根据进程的进程号,便可以知道进程的一切。

涉及到的结构:

struct task_struct* task[64]

GDT,LDT                                                                                  (具体类型不好说,其实也是个结构体数组啊)

_pg_dir pg0 pg1等


1. 根据进程号和task[],便可以找到进程的pcb(在主内存区,占有一页);

2. 根据进程号,即可在GDT相对位置找到该进程的LDTTSS描述符;

3. 根据进程号,即可在页目录表的相对位置找到属于该进程的页目录项。(当然,逻辑地址转换的时候,还要根据ldt,先加上段基址,然后转化为逻辑地址)


其中,LDT和TSS描述符位于进程PCB的内部,不同的进程初始化方式不同。进程0的LDT和TSS是事先写死,进程1的则是fork时初始化。就好比给变量赋值有两种方式,一种是“Int a=5;”。一种是“int a;a=5;”。另外感慨一下,Linux下的各种(结构体)数组(其实IDT GDT也是数组嘛),好像都有这个感觉,对象XXX的数据放在什么位置,跟对象的序号是有对应关系的。


二、地址转换过程

逻辑地址(段内偏移地址) ==》

分段机制,找到该段的段描述符,加上获取的段基址(linux0.11中为“进程号*64M”)

线性地址 ==》

分页机制,截取线性地址的不同位,分别作为页目录表索引、页表索引和页内偏移地址

物理地址


三、进程涉及到的结构在内存中的位置(进程0比较特殊)


1.PCB,在主内存区占有一页内存,进程创建时临时申请;

2.内核态栈,在主内存区和PCB共享一页,不过在页的末端,向低地址方向增长(反正是共享一页,分处两端);

3.代码段和数据段,在主内存区,进程创建时临时申请;

4.用户态栈,位于数据段所在区域的末端(有点类似内核态栈和PCB的意思,不过用户栈和数据段共享的一般不只一页);


以上如有错误,欢迎大家指正!



0 0