linux0.12内核剖析 - 内存管理(二)

 

内存保护。

保护

处理器寄存器的2个比特位定义了当前执行程序的特权级,称为当前特权级(CPL Current Privilege Level )

  • 对于分段机制,处理器使用段寄存器中选择符(RPL和CPL)和段描述符中各个字段执行保护验证。

  • 对于分页机制,则主要利用页目录和页表项中的R/W和U/S标志来实现保护操作。

分段级保护机制下的特权级检查

对于分段级保护机制,处理器使用段寄存器中选择符(RPL和CPL)和段描述符中各个字段执行保护验证,即特权级检查。这种保护机制是可靠的多任务运行环境所必须的。它可用于保护各个任务免受相互之间的干扰。例如普通的用户进程试图去获取root密码。

Intel80X86 CPU共分4个保护级,0级具有最高优先级,而3级优先级最低。数值越大,特权越小。Linux0.12使用了CPU的0和3两个保护级。同时,硬件提供了用户程序进入内核的唯一方式,即中断指令int,int指令会将CS中的CPL改为0,从而进入内核。

  • CPL:(Current Privilege Level,当前特权级)。CPL是当前正在执行程序或任务的特权级,它存放在CS和SS段寄存器的位0和位1中。通常,CPL等于当前代码段(CS)的特权级。

  • DPL:(Descriptor Privilege Level,描述符特权级)。DPL是一个段或门的特权级,它存放在段或门描述符的DPL字段中。在当前执行代码段试图访问一个段或门时,段或门的DPL会用来与CPL以及段或门选择符中的RPL(见下面说明)作比较。

  • RPL:(Request Privilege Level,请求特权级)。 RPL是一种赋予段选择符的超越特权级,它存放在选择符的位0和位1中。处理器会同时检查RPL和CPL,以确定是否允许访问一个段。即使程序或任务具有足够的特权级(CPL)来访问一个段,但是如果提供的RPL特权级不足的话访问也将被拒绝。

也就是说,只有当DPL>=CPLDPL>=RPL时,当前特权级的任务才能访问对应的目标段内存。如下图所示