最初开始ORANGE‘S时,陷入了保护模式。 我感到代码枯燥无味,很难懂。 不管读了多少次文字,都还在犹豫。 觉得自己基础太烂了,看着大灰狼,保护模式终于有了基本概念。 因此笔记本基本上使用的是大灰狼的课堂笔记本,而代码和实现环境使用的是orange’s。 最终的目的是学习orange’s。 很遗憾,一直没有找到狼老师的第二部分,后面的学习进度也让自己有点担心。
要理解保护模式,首先从实模式开始。
一.实模式
首先,添加计算机时,CPU默认在实模式下运行。
实模式具有只能访问地址在1M以下的存储器的特征。 (1M以下的内存为普通内存,1M以上的内存为扩展内存)。
地址方式为seg:offset,基址:偏移地址模式,可读取20位即1M的存储器。
但是,80386有32条地址线,也就是2的32次方即4GB的地址空间,但是与16位CPU完全兼容,能够继续使用16位CPU的存储器地址方式。 也就是说,80386使用16位寄存器表示存储器地址,但寻址方式与实模式基址:偏移地址模式不同。 此问题是为了保护模式而需要解决的问题。
二.保护模式
保护模式下仍使用16位cxdhb和通用寄存器
1、存储器访问思路
实模式和保护模式的内存都表示为一个内存段。 另一方面,在实模式下,采用基址:偏置地址方式进行数据的访问。 在保护模式下,cxdhb将预分隔的内存段信息保存在表中,而cxdhb保存所访问的内存段在表中的索引。 因此,在保护模式下,cxdhb的内容产生了新的含义。 也就是说,这是为了保存此表的索引项。 表示该存储器段信息的表是段描述符表,表示表中每个32比特的存储器段的信息被称为段描述符,而存储表中的索引的cxdhb也称为不安全组。
2、不安的年轻人
不安分群,即cxdhb的内容为16位,其中前13位表示段描述符中的索引,后3位表示段描述符表中指定的段描述符属性。
从不安的年轻人的配置可以看出,段描述符最多有2的13次方,即8096个,即最多8096个描述符。
第三位TI是table indicator,用于指示是从全局描述符表读取描述符,还是从本地描述符读取描述符。
本地描述符(程序自身的内部数据(栈栈栈、数据段信息等) )。
全局描述符:程序必须调用的外部数据(例如库函数)
最低两位(RPL )请求权限级别,用于权限检查
3、形成物理地址
4、段描述符
段描述符为8字节。
寂寞小白菜(segment limit )共有20位,分两部分存储,第一部分存储在1、2字节中,剩下的位于第7字节的后4位。
atgdzt地址(segment base )共有32位,保存时分为两部分。 第一部分0-23位存储在3-5字节中,第二部分24-31位存储在第8字节中。
段属性(attributes ) :包括段属性和寂寞小白菜的第二部分。 其作用是记述该段是数据段、代码段还是堆栈段; 和段描述符中指定的内存段是否存在于物理内存中。
对于数据段/堆积栈段,是否可写。
对于代码段,是否可执行。
其中段属性的16位具体分布如下:
type )说明用段描述符记述的段的具体属性(数据/代码、读取/写入)
“DT”表示描述符中指定的是系统段、存储段,还是通常为存储段
DPL :权限级别,最高为0,最低为3 (操作系统级别为0 ) )。
p :此描述符是否对地址转换有效(1:有效0 :无效) ) ) ) ) )。
limit :寂寞小白菜的剩余部分
AVL :软件的可用性,80386对该比特没有规定
D :对于代码段,是16位(0)还是32位)1); 对于数据段,是64k(0)还是4GB ) )1)
g )寂寞小白菜粒度,G=0,段边界为64k,G=1,段边界为4GB (保护模式下均为4GB ) ) )。