linux中每个进程的内核栈,与整个内核空间是什么关系?
-
所有进程的内核栈都在内核可以映射到的空间(内核物理地址与线性地址是一一映射的,在head.s中分配好的一个页目录表与四个页表,内核所映射的4个页表4**4k*4k=16M已经涵盖的地址空间即Linux0.11的16M内
-
进程task_struct与kernelstack的一个stack union共用体,所以每个进程都有自己单独的内核栈,它们共享的是内核地址空间(翻转特权级交给内核管理)。由于进程数量很多,所以这也是内核栈比较小的原因。
Intel80x86体系结构分页机制是基于保护模式的,先打开eflags中的pe,再打开pg.保护模式是基于段的,换句话说就是先设置进程的分段,在设置进程的分页。进程都有数据和程序,这些数据和程序的寻址都是段加偏移的形式(逻辑地址),CPU硬件会自动将其转换成CPU能够寻址的线性地址,再根据操作系统对页目录表和页表的设置,将线性地址转换成物理地址。
进程0的task_struct长度是640K
一共有64个进程,每个进程64M (64*64M=4G),进程代码段和数据段的基地址就是他的进程号nr * 64MB
Linux0.11中仅有一个页目录表
只有两个东西与物理地址有关:CR3中记录的页目录表基址;页对应的页表项
Linux 0.11 系统中共使用了四种堆栈。一种是系统初始化时临时使用的堆栈;一种是供内核程序自己使用的堆栈(内核堆栈),只有一个,位于系统地址空间固定的位置,也是后来任务 0 的用户态堆栈;另一种是每个任务通过系统调用,执行内核程序时使用的堆栈,我们称之为任务的内核态堆栈,每个任务都有自己独立的内核态堆栈;最后一种是任务在用户态执行的堆栈,位于任务(进程)地址空间的末端。下面分别对它们进行说明。