《linux内核设计的艺术》书中提到,“操作系统最难和最有价值的是它的整体,整体看明白了,局部才能清楚。”本章讲一下linux0.11中进程的一些整体情况,希望对大家有一些帮助。
一、首先,Linux0.11中进程如此安排,达到的效果便是:根据进程的进程号,便可以知道进程的一切。
涉及到的结构:
struct task_struct* task[64]
GDT,LDT (具体类型不好说,其实也是个结构体数组啊)
_pg_dir pg0 pg1等
1. 根据进程号和task[],便可以找到进程的pcb(在主内存区,占有一页);
2. 根据进程号,即可在GDT相对位置找到该进程的LDT和TSS描述符;
3. 根据进程号,即可在页目录表的相对位置找到属于该进程的页目录项。(当然,逻辑地址转换的时候,还要根据ldt,先加上段基址,然后转化为逻辑地址)
二、地址转换过程
逻辑地址(段内偏移地址) ==》
分段机制,找到该段的段描述符,加上获取的段基址(linux0.11中为“进程号*64M”)
线性地址 ==》
分页机制,截取线性地址的不同位,分别作为页目录表索引、页表索引和页内偏移地址
物理地址
三、进程涉及到的结构在内存中的位置(进程0比较特殊)
1.PCB,在主内存区占有一页内存,进程创建时临时申请;
2.内核态栈,在主内存区和PCB共享一页,不过在页的末端,向低地址方向增长(反正是共享一页,分处两端);
3.代码段和数据段,在主内存区,进程创建时临时申请;
4.用户态栈,位于数据段所在区域的末端(有点类似内核态栈和PCB的意思,不过用户栈和数据段共享的一般不只一页);
以上如有错误,欢迎大家指正!