试图理解80836实模式转变为保护模式

8086cpu内存地址线有20位,寻址空间可以达到1M,但是寄存器却只有16位,所以为了访问到所有的内存空间,必须得使用两个寄存器。于是就有了段寄存器和基址寄存器。但是两个寄存器就一共有32位了,所以用不完,主要是第一个寄存器分多少位,第二个分多少位。第一个寄存器代表的内容叫段,第二个寄存器代表的内容叫偏移量。使用段寄存器的值和基址寄存器的值来定位一个内存。形成了 段:偏移量 的内存访问方式。通常情况下,偏移量都是直接拉满,使用16位。

8086存在的问题是谁都可以访问内存,可以自由修改内存上任意位置的数据,也就是说,在8086下,我随便写一个程序,把操作系统的数据给改了也是没问题的。

因此80286引入了分段的保护机制,首先也是给内存分段,每段的大小可以不一致。先在内存中留下一小块,记录下每段的起始位置和大小,同时还有每个段读写属性的和访问等级等,读写属性包括可读可写等权限,当要访问这个段上的数据时,只有等级够了才允许访问。这就达到了内存保护的目的。6个字节就可以记录一个段的信息。记录下这写信息的那一块内存就叫做描述符表,里边记录了所有的段,每个段6个字节。这个表的起始位置通过一个寄存器GDTR保存起来,因此所有程序都可以找到这个表。一般对于我们的现在使用的电脑来说,计算机一旦开机,把整块内存的所有段都规划好了,就往GDTR寄存器保存表的起始地址。

当进入80386后,地址线拓展到了32条,可访问内存空间达到了4GB,寄存器也达到了32位。按道理说就不需要两个寄存器来定位一个地址了,也就是不需要分段了。但80386为了达到内存保护功能,还是使用了分段的思想。原理也是和80826一样,只是位数变了,段描述符变成了8个字节。如果要切换到64位模式我暂时不知道是怎么样的,那样基址就有64位了。

坑爹的是为了向下兼容,80386刚开机时使用的是8086的模式,也称为实模式。也就是说,电脑运行后,没有段描述符表,访问内存的方式也是段:偏移量的方式。很多支持32位保护模式的寄存器都没用上。

于是存在了模式切换的需要。

模式切换,主要就是建立段描述符表,通知CPU,让CPU改变寻址方式、转换到相关32位的操作,应该就是切换到相关线路。

模式切换的方法也不难,就是执行一段代码。实现这段代码的原理或者说步骤为:
第一步,写模式切换代码之前,先规划你的内存分段,理论上随便你怎么分,分多少段都行,但是CPU要求第一个段描述符必须为空。按照惯例,一般都有数据段、代码段、堆栈段。这样比较好对程序进行处理,因为数据段可读可写、代码段可读不可写,它们是不一样的。
第二步,创建段描述符表,怎么创建呢?首先是找一块内存,起始位置作为段描述符的基址,因为运行这段代码前,CPU在16位的8086模式下运行,因此你可以把你的段描述符表写在任何地方,从那块内存开始,前8个字节写入空值(第一段为空),第二个8字节就开始写入设计的好的第一个段描述符了,8个字节保存一个段描述符,以此类推。
第三步,通知CPU,主要包括填写GDTR寄存器和修改cR0寄存器pe位的值。GDTR一共有48位,前16位记录的是段描述符表的大小,后32位记录的是段描述符表的基址,因为一个地址有32位嘛,如此,其他寄存器就可以找到GDTR寄存器的值啦!这样一来,CPU就通知完毕了。
第四步,清空缓冲区的代码,因为之前的代码都是16位了,以后要切换到32位模式运行了,这些代码不能运行了。

模式切换的这段代码也可以放在启动扇区里,达到程序一运行就立马改成32位保护模式的效果。

需要说明的是:内存分段是可以重叠的,比如把所有的整块内存空间作为数据段,然后其中一部分或者也是整块内存空间作为代码段,当数据段是4GB的整块空间,代码段也是4GB的整块空间时,叫做平坦模式。

参考:
全局描述符表
进入保护模式
结合p21、p27、p28一起看

观察到的小细节:
1,汇编中,db表示一个字节,dw表示两个字节,这个d并不代表double的意思,但是dword表示四个字节,这个d是double的意思,所以dw并不是dword的缩写。
2.注意看以下两张图片中的汇编代码都不带变量名的。就可以定义段界限、段基地址。并且大小不一样。
在这里插入图片描述
原因是定了标号,比如NullDescriptor, DataDescriptor,CodeDescriptot.标号的作用是记录了位置,可以理解为数组名,虽然里边的每一段大小不一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值