首页
社区
课程
招聘
[原创]保护模式学习笔记之基础知识
发表于: 2021-11-23 20:07 9995

[原创]保护模式学习笔记之基础知识

2021-11-23 20:07
9995

CPU是Central Processing Unit的缩写,即中央处理器,有时也简称为处理器(processor)。随着现代CPU的集成度不断提高,其结构也越来越复杂,但是它在计算机系统中的角色非常简单,那就是从内存中读取(fetch instruction)指令,然后解码(decode)和执行(execute)。指令是CPU可以理解并执行的操作,它是CPU能"看懂"的唯一语言。

指令由操作码(opcode)和0到多个操作数组成。寻址方式定义了得到操作数的方式,是指令系统乃至CPU架构的关键特征,以下是以x86汇编语言为例的4种不同的寻址方式

上面说到过寻址是CPU的关键,需要根据情况使用不同的寻址方式来实现操作数的获取,不同的寻址方式也是不同操作模式的最大区别。

CPU的操作模式也可以理解成CPU的工作方式,在不同的模式下CPU按照不同的方式来工作,目的是执行不同种类的程序,完成不同的任务。目前的IA-32处理器定义了如下的五种模式

简称实模式,即模拟8086处理器的工作模式。此模式下的IA-32处理器相当于高速的8086处理器。实模式提供一种简单的单任务环境,可以直接访问物理内存和I/O空间,由于操作系统和应用软件运行在同一个内存空间中和同一优先级上,应此操作系统的数据很容易被应用程序破坏。DOS操作系统就是工作在实模式下。CPU复位(resnet)或加电(power-on)的时候以实模式启动,处理器以实模式工作。

实模式最开始出现于早期的8086CPU的时期,当时的CPU只有20根的地址线,此时的地址空间就是1M。用来寻址的是8个16位的通用寄存器,4个16位的段寄存器,但是16位的寄存器只能寻址64K的地址空间,为了让16位的寄存器构成20位的主存地址,就需要采用(段基址:段偏移的方式)来寻址。

段基址由段寄存器提供,分别是cs,ds,ss,es,fs,gs。段偏移则由通用寄存器来提供,为了通过这两部分构成20位的主存地址,就需要将段基址左移4位以后在与段偏移相加,这样就得到了一个20位的主存地址,也就是说此时

物理地址=段基址 << 4 + 段内偏移

比如此时ds段寄存器的值是0x4000,而通用寄存器di的值为0x1900,那么它们构成的地址就是

ds:di = 0x3000 << 4 + 0x1900 = 0x31900

CPU工作在这种模式下,它的寻址速度是非常快的,因为可以直接获得物理地址对其进行读写。但是它的寻址范围非常有限,且操作系统和普通的应用程序可以同样对这片空间进行读写,这就给安全性带来了很大的问题。

所有IA-32处理器的本位模式,具有强大的虚拟内存支持和完善的任务保护机制,为现代操作系统提供了良好的多任务运行环境。其名称中的”保护“就是保护多任务环境中各个任务的安全。多任务环境的一个基本问题就是当多个任务同时运行时,如何保证一个任务不会受到其他任务的破坏,同时也不会破坏其他任务,也就是要实现多个任务在同一系统中”和平共处,互不侵犯“。所谓任务,从CPU层来看就是CPU可以独立调度和执行的程序单位。在Windows操作系统来看,一个任务就是一个线程或进程。

进一步来说,可以把保护模式对任务的保护机制划分为任务内保护和任务间保护。任务内的保护是指同一任务空间内不同级别的代码不会互相破坏。任务间的保护就是指一个任务不会破坏另一个任务。简单来说,任务间的保护是靠内存映射机制(段映射和页映射)实现的,任务内的保护是靠特权级检检查实现的。

随着CPU的发展,CPU有了32根地址线,此时可以表示的地址范围就是4GB。同时,通用寄存器也从16位扩展到32位,此时只需要一个通用寄存器就可以寻址4GB的地址空间。但是,为了兼容早期的CPU,此时的寻址方式依然采用的是(段基址:段偏移)的寻址方式。

表示段基址的段寄存器由16位变成了96位,只不过可见的只有16位,且此时的段寄存器保存的就不再是段的基址,而是索引和该段的特权级,通过索引来去全局描述符(GDT)中找到对应段的表项,这里的每一个表项都是段描述符,存放了断基址,段界限等内容。通过特权级就可以实现同一个任务中不同内存具有不同的权限,这就实现了任务内保护。

段偏移由32位的通用寄存器来决定,表示的还是偏移地址,将它与段基址相加得到了虚拟地址,这个虚拟地址在经过页机制的转换才可以获得真正的物理地址,这样就可以保证一个任务无法访问另一个任务的内存。

段机制和页机制是保护模式的核心,因为这两个机制的存在,才实现了对内存的安全访问,段机制和页机制也是保护模式的主要内容。

任务间保护主要是靠虚拟内存映射机制来实现的,即在保护模式下,每个人物都被置于一个虚拟内存空间中,操作系统决定何时以及如何把这些虚拟内存映射到物理内存。举例来说,在Win32下,每个任务都被赋予4GB的虚拟内存空间,可以用地址0~0xFFFFFFFF来访问这个空间中的任意地址。尽管不同任务可以访问相同的地址(比如0x00401010),但因为这个地址仅仅是本任务空间中的虚拟地址,不同任务处于不同的虚拟空间中,不同任务的虚拟地址可以被映射到不同的物理地址,这样就可以很容易防止一个任务内的代码直接访问另一个任务的数据。IA-32 CPU提供了两种机制来实现内存映射:段机制和页机制。

任务内保护主要用于操作系统。

操作系统的代码和数据通常被映射到系统中每个任务的内存空间中,并且对于所有任务其地址是一样的。例如,在Windows系统中,操作系统的代码和数据通常被映射到每个进程的高2GB空间中。这意味着操作系统的空间对于应用程序是“可触及的”,应用程序中的指针可以指向操作系统所使用的内存。

任务内保护的核心思想是权限控制,即为代码和数据根据其重要性指定特权级别,高特权级的代码可以执行和访问低特权级的代码和数据,而低特权级的代码不可以直接访问和执行高特权级的代码和数据。高特权级通常被赋予重要的数据和可信任的代码,比如操作系统的数据和代码。低特权级通常被赋予不重要的数据和不信任的代码,比如应用程序。这样,操作系统可以直接访问应用程序的代码和数据,而应用程序虽然可以指向操作系统的空间,但是不能直接访问,一旦访问就会被系统发现并禁止。在Windows系统中,会看到如下图所示的应用程序错误对话框,导致这种情况的一个典型原因就是应用程序有意或无意的访问了禁止访问的系统空间,从而被系统发现。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-12-10 10:41 被1900编辑 ,原因:
上传的附件:
收藏
免费 4
支持
分享
最新回复 (2)
雪    币: 922
活跃值: (1798)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
谢谢大佬!学习啦
2023-1-25 15:48
0
雪    币: 922
活跃值: (1798)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
直接寻址那一区打错字了:采用
2023-1-25 15:49
0
游客
登录 | 注册 方可回帖
返回
//