80386CPU保护模式下如何设定安全属性

独行   ·   发表于 2020-10-23 11:06:27   ·   技术文章投稿区

作者:天象独行


保护模式下如何设定安全属性呢?我们知道,在保护模式下,80386CPU(注意:这里不一定特指80386CPU,以后出现版本且具备保护模式均可如下来理解。并且下面将用CPU表示)可以具备处理地址空间是否可以被写入,可以被多少优先级代码写入,是不是允许执行等问题。那么,CPU是如何做到这样的呢?我们来换个思路来思考。CPU是如何区分什么地址空间来是否被写入。这里是不是需要一个标识。比如,我发现一个“标识”,就表示可以被写入,没有发现这个“标识”就不允许写入。那这样是不是可以达到一个“是否具备处理地址空间写入”这个需求的目的呢?那么其他的保护功能呢?一样换不同的“标识”是不是就可以了呢?好了,现在我们知道有了一个设定保护功能的一个方案,那么接下来,我们在看看下面一个问题。


现在我们知道了需要一个“标识”来区分安全属性。那么问题来了,我们应该将这个“标识”放在什么位置呢?这个时候我们来回顾一下CPU是如何寻址的。它是采用“段地址:偏移地址”的模式来定位地址的(注释:这里的地址笼统表示地址,并不具体指Dos当中的物理地址,还是Window32当中的线性地址)在Dos 时代,物理地址是用20bit来表示,但是当时的寄存器只有16bit。所以采用了段地址加偏移地址的模式来定位。(寻址内容知识建议学习王爽老师书籍《汇编语言》)那么,在现在的时代下,寄存器有32bit 。我们完全可以使用“偏移地址”来表示所有的地址空间。那这个时候“段地址”就被“架空”出来了。我们来考虑一下,既然我们需要一个位置来存放判定安全属性的“标识”。能否利用一下这个“段地址”呢?好吧,现在我们大概又能处理“标识”存放位置的问题了。然而新的问题总是来得这么猝不及防。我们再来讨论一下新的问题。


我们统计了一下,保护模式下的各种安全属性总共需要64bit的大小。那么问题来了,段地址的寄存器只有16bit啊。那么又该怎么处理呢。想想看,我们能不能找一个固定的空间来存放这样的“标识”,然后段地址只是保存这些标识的“索引”。通过“索引”来定位到具体的“标识”是不是可以解决这样的问题了呢。好吧,那么这个问题处理好了。我们再来看看新的问题。是不是觉得有点儿烦躁了。问题总是一个接着一个。


接下来,我们来看看,既然我们需要一个固定空间来存放标识。那么CPU是如何找到这样的固定空间呢?我们是不是需要一个寄存器来保存固定空间的地址以便CPU是可以很快的找到这样的固定空间呢?


好了。根据上边的文字,通过一步一步的问题的出来,我们大概有了一个清晰的概念。那么解下来我们来看看CPU是如何处理这个问题的。大致思路与上面一样。
首先,我们来引入两个新的寄存器48bit GDTR,16bit LDTR。这两个寄存器分别来管理着保存“标识”的固定地址空间。这些固定地址空间也分别赋予两个名称:全局描述符表GDT。局部描述符表LDT。为什么会有两张表呢?完全是因为我们在程序的编写中需要有全局的安全属性以及私有的安全属性。现在我们来看看,这两张表当中分别存放了哪些内容:GDT表中存放系统中所有任务可以使用的段描述符(代码段,数据段,堆栈段,以及LDT段)。LDT表当中存放了每个任务私有的代码段,数据段,堆栈段。


现在我们再来看看,既然有两张表,CPU 是如何通过段地址来判断“安全属性”保存在哪张表里面呢?同样,CPU需要区分这个问题,一样要用到一个“标识”。下面我们来看看CPU是如何判定的。段地址一共有16bit 。高13位表示“索引”,0~1位表示当前优先级RPL,第2位TI位表示“安全属性”存放在那一张表当中。如果TI=1表示存放在LDT当中,TI=0表示存放在GDT当中。
好的。解下来我们用示例来帮助大家理解吸收一下内容。首先请各位查看如下图:


当TI=0 时,“安全属性”保存在GDT当中,我们需要在GDTR寄存器当中获取到GDT地址(查看步骤1),然后通过存放在段寄存器当中的高13位(索引值)在GDT当中获取对应的安全属性(查看步骤2),进而通过结合偏移地址,定位正确的起始地址(步骤3)。(注意:该文章主要时说明安全属性的存放调用,其它关于起始地址,基址等问题不予讨论)
当TI=1时,“安全属性”保存在LDT当中,我们同样需要在GDTR寄存器当中获取到GDT地址(查看步骤1’),然后通过LDTR寄存器当中的索引在GDT当中寻找到LDT的地址。(查看步骤2’和3’),之后通过段寄存器当中的索引值在LDT表当中寻找但“安全属性”(查看步骤4’)。最后结合偏移地址来确定正确的起始地址(步骤5’)

  1. 总结:
  2. DOS时代遗留下来的段地址,更改位段描述符,用来保存索引查找到“安全属性”。安全属性则保存在GDT,LDT这两个表中,且有GDTR,LDTR来控制着。
用户名金币积分时间理由
admin 50.00 0 2020-10-26 15:03:36 鼓励,希望跟进最新的内容

打赏我,让我更有动力~

0 Reply   |  Until 2020-10-23 | 377 View
LoginCan Publish Content
返回顶部 投诉反馈

© 2016 - 2022 掌控者 All Rights Reserved.