(4). 页表管理
下面我们来看下页表的建立过程。前面我说过,进程分为用户进程和内核进程。用户进程可以有多个,而内核进程则只有一个。因此,对于内核进程页表,我们只有一份。下面我以e6500平台为例说明内核进程页表和用户进程页表是怎么建立和管理的。
我们先来思考下,在什么时候,我们才需要真正的创建一个页表呢。前面我说过,页表是按需创建的,就是说在物理页面分配之后,我们才会创建相应的页表项。这里说下页表项和页表的区别。我这里说的页表是指PGD表,PUD表,PMD表,PTE表,在上一节,我画了一张图表示它们。它们包含了各自的页表项,如PGD,PUD,PMD和PTE。在创建相应页表项时,如果所在的页表还没有分配内存,那么需要调用页表alloc函数进行内存分配,然后再进行页表项的设置。那么页表的建立第一步就是需要分配各级页表内存存储空间。
因为PGD表对于每个进程来说都是必须的,所以PGD表的存储空间是在每个进程创建的时候就分配好的,虽然这个时候还不需要对PGD进行设置。
内核进程PGD表的创建
内核进程,就是init 0进程,是内核执行任务的空间,它有自己的进程存储空间,它负责处理像进程调度、内存管理、文件系统、异常处理、外设管理这样的计算机自身的问题。linux内核启动时,内核代码会对系统进行一些初始化的工作,在这之后,内核会建立内核进程的运行环境。我们说一个进程,对于系统来说,就是一个抽象实体,我们会用一些数据结构表示的数据来记录这样一个实体的行为。这个实体有自己的代码(行为),有自己的存储空间(虚拟地址),有自己的CPU