linux0.11中的进程

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

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

涉及到的结构:

structtask_struct*task[64]

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

_pg_dirpg0pg1等

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

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

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

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

二、地址转换过程

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

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

线性地址 ==》

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

物理地址

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

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

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

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

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

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

悠然享受和大自然融合之乐。

linux0.11中的进程

相关文章:

你感兴趣的文章:

标签云: