保护模式下是如何访问内存的?

本文探讨了在保护模式下如何利用GDT和GDTR结构访问内存,详细介绍了段选择子的概念,以及如何通过修改段寄存器如DS来实现打印字符串的操作。处理器在接收到指令后,会进行一系列计算和检查,最终通过描述符缓冲区直接访问内存,而不再每次都需要查询GDT。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前文说到我们由实模式进入保护模式之前会对生成GDT并且设置GDTR,现在就是在保护模式下利用他们访问内存的时候了。

当前的GDT和GDTR结构

在这里插入图片描述
这是上篇中我们设置的GDT,它有四段,现在我们的目标是在屏幕上打印字符串,所以要操作的就是显存所在的段,第三段下标索引是2.

段选择子

8086下访问内存需要给CS,DS,ES,SS写入段地址,然后左移四位加上偏移地址直接访问物理内存。保护模式下,段寄存器扩展了两个FS和GS,改叫段选择器,我们向其中写入的是段选择子。段选择器的位数和8086段寄存器一样是16位,但是它还有一个不可见的描述符告诉缓存区,其中存储的是段的线性基地址,界限和属性,和我们前文的GDT中的结构相对应。

在这里插入图片描述

打印字符串

我们选择使用ds做为默认段,现在要做的就是修改ds中的值,顺便一提可以修改段寄存的指令有mov,pop,jmp,jmp far,call far,iret,retf等。

		mov cx,0000000000010_0_00B         ;加载数据段选择子(0x10)
										   ;表示索引是2,特权级是0,存在于GDT中而不是LDT
		mov ds,cx

处理器得到该指令后执行顺序是这样的:

  • 将段选择子中的索引*8做为偏移地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值