一、理解保护模式
大多数现代操作系统(包括Windows 9X/NT/XP和Linux等)都是多任务的,CPU的保护模式是操作系统实现多任务的基础。了解保护模式的底层原理对学习操作系统有着事半功倍的作用。
保护模式是为了实现多任务而设计的,其名称中的“保护”就是保护任务环境中各个人物的安全。多任务环境的一个基本问题就是当多个任务同时运行时,如何保证一个任务不会受到另一个任务的破坏,同时也不会破坏其他任务,也就是要实现多个任务在同一个系统中“和平共处,互不侵犯”。所谓的“任务”,从CPU的角度来看就是CPU可以独立调度和执行的程序单位。从Windows操作系统的角度来看,就是一个任务就是一个线程(thread)或者进程(process)。
总结来说,可以把保护模式对任务的保护机制划分为任务内的保护和任务间的保护。任务内的保护指的是同一任务内不同级别的代码不会相互破坏。任务间的保护指的是一个任务不会破坏另一个任务。简单的说,任务间的保护是靠内存映射机制(包括段映射和页映射)实现的,任务内的保护是靠特权级别检查实现的。
1.1任务间的保护机制
任务间的保护主要是靠虚拟内存映射机制来实现的,即在保护模式下,每个人物都被置于一个虚拟内存控件中,操作系统来决定何时以及如何把这些虚拟内存映射到物理内存。
举例:
在Win32下,每个人物都被赋予4GB的虚拟内存空间,可以用地址0~0XFFFFFFFF来访问这个空间的任意地址。虽然不同的人物可以访问相同的地址(比如:0x00401010,但是因为这个地址仅仅是当前任务空间中的虚拟地址,不同任务处于不同的虚拟空间中,不同任务的虚拟地址被映射到不同的物理地址,这样就可以很容易的防止一个任务内的代码直接访问另一个任务的数据。IA-32 CPU提供了两种机制来实现内存映射:段基址(Segmentation)和页基址(paging)。
1.2任务内保护机制
任务内的保护机制主要用于保护操作系统。
操作系统的代码和数据通过被映射到系统中每个人物的内存空间中,并且对于所有人物其地址是一样的。例如,在Windows系统中,操作系统的代码和数据通常会被映射到每个进程的高2GB空间中。这意味着操作系统的空间对于应用程序来说是“可触及的”,应用程序中的指针可以指向操作系统中所使用的内存。
任务内保护的核心思想就是权限的控制,即代码和数据根据其重要性指定特权级别,高特权级的代码可以执行和访问低特权级的代码和数据,而低特权级的代码不可以直接执行和访问高特权级的代码和数据。高特权级通常被赋予重要的数据和可信任的代码,比如操作系统的数据和代码。低特权级通常被赋予不重要的数据和代码,比如应用程序。这样操作系统可以直接访问应用程序的代码和数据,而应用程序虽然可以指向系统的空间,但是不能访问,一旦访问就会被系统发现并且禁止。
实例:
int main(int argc,char*argv[])
{
*(int*)0x8003f100 = 0x22; //视图访问高2GB内存并且赋值
return 0;
}
分析:尽管应用程序可以指向系统的内存,但是访问时会被系统发现并且禁止。
事实上,应用程序只能通过系统提供的接口(API)来使用操作系统的服务,即系统调用。系统调用相当于在系统代码和用户代码之间开了一扇有人看守的小门。
1.3特权级
标签:保护模式,操作系统,映射,代码,保护,任务 From: https://www.cnblogs.com/zhongyongzixue/p/18067335