天天看点

内核空间与用户空间之一:基础概念

(1)Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此Linux的虚拟地址空间也为0~ 4G(32位地址最大访问极限)。Linux内核将这4G字节的空间分为两部分,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF,供各个进程使用,称为“用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。 

内核空间与用户空间之一:基础概念

(2)其中,内核地址空间又被划分为"物理内存区","虚拟内存分配区","高端页面映射区","专用页面映射区","系统保留映射区"几个区域。在标准配置下,物理区最大长度为896M,系统的物理内存被顺序映射在物理区中,当系统物理内存大于896M时,超过物理区的那部分内存称为高端内存。低端内存和高端内存用highmem_start_page变量来定界,内核在存取高端内存时必须将它们映射到"高端页面映射区"。

      Linux保留内核空间最顶部128K区域作为保留区,紧接保留区以下的一段区域为专用页面映射区,它的总尺寸和每一页的用途由fixed_address枚举结构在编绎时预定义,用__fix_to_virt(index)可获取专用区内预定义页面的逻辑地址。在专用页面区内为CPU预定义了一张高端内存映射页,用于在中断处理中高端页面的映射操作。

      距离内核空间顶部32M,长度为4M的一段区域为高端内存映射区,它正好占用1个页帧表所表示的物理内存总量,它可以缓冲1024个高端页面的映射。在物理区和高端映射区之间为虚存内存分配区,用于vmalloc()函数,它的前部与物理区有8M隔离带,后部与高端映射区有8K的隔离带。

      当系统物理内存超过4G时,必须使用CPU的扩展分页(PAE)模式所提供的64位页目录项才能存取到4G以上的物理内存。在PAE模式下,线性地址到物理地址的转换使用3级页表,第1级页目录由线性地址的最高2位索引,每一目录项对应1G的寻址空间,第2级页目录项以9位索引,每一目录项对应2M的寻址空间,第3级页目录项以9位索引,每一目录项对应4K的页帧。

(3) 关于内核态和用户态:当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。

内核空间与用户空间之一:基础概念
内核空间与用户空间之一:基础概念

      关于进程上下文和中断上下文。处理器总处于以下状态中的一种:

1、内核态,运行于进程上下文,内核代表进程运行于内核空间;

2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;

3、用户态,运行于用户空间。

(4)通常我们只会在用户空间通过linux native/app 层 读写文件,但可能有一些非常特别的情况下,我们需要直接在Kernel 中读写文件信息,参见FAQ10425

继续阅读