安装存储器的段描述符并加载GDTR

代码清单

         ;代码清单12-1;文件名:c12_mbr.asm;文件说明:硬盘主引导扇区代码;创建日期:2011-5-16 19:54;修改于2022-02-16 11:15;设置堆栈段和栈指针mov ax, csmov ss, axmov sp, 0x7c00;计算GDT所在的逻辑段地址12      mov ax, [cs: gdt_base + 0x7c00]              ;低16位13      mov dx, [cs: gdt_base + 0x7c00 + 0x02]       ;高16位14      mov bx, 1615      div bxmov ds, ax                                   ;令DS指向该段以进行操作mov bx, dx                                   ;段内起始偏移地址;创建0#描述符,它是空描述符,这是处理器的要求mov dword [bx+0x00],0x00mov dword [bx+0x04],0x00;创建#1描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区)mov dword [bx+0x08],0x8000ffffmov dword [bx+0x0c],0x0040920b;初始化描述符表寄存器GDTRmov word [cs: gdt_size+0x7c00],15            ;描述符表的界限(总字节数减一)lgdt [cs: gdt_size+0x7c00]in al,0x92                                   ;南桥芯片内的端口or al,0000_0010Bout 0x92,al                                  ;打开A20cli                                          ;保护模式下中断机制尚未建立,应;禁止中断mov eax,cr0or eax,1mov cr0,eax                                  ;设置PE位;以下进入保护模式... ...mov cx,00000000000_01_000B                   ;加载数据段选择子(0x08)mov ds,cx;以下在屏幕上显示"Protect mode OK."mov byte [0x00],'P'mov byte [0x02],'r'mov byte [0x04],'o'mov byte [0x06],'t'mov byte [0x08],'e'mov byte [0x0a],'c'mov byte [0x0c],'t'mov byte [0x0e],' 'mov byte [0x10],'m'mov byte [0x12],'o'mov byte [0x14],'d'mov byte [0x16],'e'mov byte [0x18],' 'mov byte [0x1a],'O'mov byte [0x1c],'K'mov byte [0x1e],'.'hlt                                          ;已经禁止中断,将不会被唤醒;-------------------------------------------------------------------------------gdt_size         dw 0gdt_base         dd 0x00007e00               ;GDT的物理地址times 510-($-$$) db 0db 0x55,0xaa

现在还处在实模式下,因此GDT中安装描述符,必须将GDT的线性地址,这里线性地址就是物理地址以下线性地址都称为物理地址,转换成逻辑逻辑段地址和偏移地址

gdt_base处开辟了一个双字(因为是实模式,所以这里是4个字节为一个双字)来保存GDT的线性地址

看到第12行,将GDT线性地址的低16位传送到寄存器AX中

和之前一样,使用了段前缀“cs:”,表明是访问代码段中的数据

此时,代码段中的逻辑段地为0,主引导程序就位于这个段中且偏移地址是0x7c00

标号gdt_base代表的数值是它相对于主引导程序起始处的位移量,所以这个数据有效地址是0x7c00+gdt_base
在这里插入图片描述

在第13行将GDT线性基地址的高16位传送寄存器DX

14~15行将取得的线性基地址转换成逻辑地址,也就是将GDT的内存位置当成一个段来操作

DA:AX除以16,商在AX中段地址,余数在DX中偏移地址

在这里插入图片描述
接着17~18行将寄存器AX中的逻辑段地址传送到数据段寄存器DS中,将偏移地址传送到寄存器BX中

处理器规定,GDT中第一个描述符必须是空描述符

描述符选择子(简称选择子)用来选择一个段描述符,并加载到段寄存器

描述符选择子包含了描述符在描述表中的序号(索引号)

如果选择的GDT中的第一个描述符(0号)

则选择子为0

一个未初始化的选择子也是0,使用这样的描述符默认选择GDT中的0号描述符,但并不是我们的本意

所以,处理器要求将第一个描述符定义成空描述

在这里插入图片描述
看到21和22行,将两个全0的双字分别写入BX和BX+4的地方

在进入保护模式后

我们希望在屏幕上显示“到此一游”,所以要访问显存,要访问显存就必须定义成一个段,并创建一个描述符

25和26行
在这里插入图片描述
描述符各个字节在内存中的映像,在INTEL中是低端字节序,低位在低地址,高位在高地址

可以看到
线性基地址为0x000B8000
段界限为0x0FFFF,粒度为字节(G=0),即,该段的长度为64KB
属于存储器的段(S=1)
这是一个32位的段(D=1)
该段目前位于内存中(P=1)
段的特权级为0(DPL=00)
这是一个可读可写、向上扩展的数据段(TYPE=0010)

这些完成后,接下来就是加载描述符表的线性基地址和界限到寄存器GDTR,使用lgdt指令
该指令的格式为
lgdt m 在有效地址m处,包含GDT的32位线性地址和16位界限值,共6字节

lgdt指令从指定的内存地址处加载6字节的数据到寄存器GDTR,其中包括32位的GDT线性地址及16位的界限值

该指令在实模式和保护模式下都可以执行,但是在实模式下使用16位的有效地址m访问内存;在32位保护模式下使用32位的有效地址m访问内存

在6字节的内存区域中,要求前(低)16位是GDT的界限值,后(高)32位是GDT的基地址

计算机启动后,在初始状态下,寄存器GDTR的基地址被初始化为0x00000000;界限值0xFFFF

在这里插入图片描述
第29行,GDT的界限值15写入标号gdt size 所在的内存单元

与访问gdt base 处的数据一样,标号gdt size 处的这个字节,有效地址为gdt size+0x7c00

这里一共写了2个描述符,每个占用8字节,两个就是16字节

GDT的界限值总字节数减去1,所以是15

接着第31行,gdt size开始的6字节加载到GDTR

因为gdt size 和gdt base是连续声明的,所以从gdt size 处读取6字节,包括gdt base

目前还没有进入保护模式,所以以上都是在实模式上进行的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件删错后的救赎:恢复与预防策略

日常使用电脑、手机或其他存储设备时,我们时常会遭遇文件删错的尴尬局面。那些原本珍贵或至关重要的文件,可能因为一次意外的点击、一次误操作,甚至是一次设备故障而消失得无影无踪。本文将深入探讨文件删错的定义、原因、恢复方案以及预防措…

上传图片并显示#Vue3#后端接口数据

上传图片并显示#Vue3#后端接口数据 效果&#xff1a; 上传并显示图片 代码&#xff1a; <!-- 上传图片并显示 --> <template><!-- 上传图片start --><div><el-form><el-form-item><el-uploadmultipleclass"avatar-uploader&quo…

16.FreeRTOS直接任务通知 Notification

FreeRTOS 直接任务通知 Notification 介绍 在嵌入式系统开发中&#xff0c;任务间的通信和同步是非常重要的一部分。而FreeRTOS就提供了多种机制来实现这些&#xff0c;比如队列、信号量和事件组。不过&#xff0c;使用这些机制都需要创建一个通信对象&#xff0c;不能直接把事…

This may be due to a blocked port, missing dependencies

安装XAMPPXAMPP之后启动mysql出现如下问题&#xff0c;只需双击XAMPP安装目录下的setup_xampp&#xff0c;等待运行完毕。 重启&#xff0c;双击xampp-control. 重新进入xampp控制界面&#xff0c;点击start。

Python私教张大鹏万字长文讲解Tailwindcss Flex 和 Grid 布局相关的样式,附完整源码和效果截图

flex-basics 样式类 Utilities for controlling the initial size of flex items. 用于控制伸缩项的初始大小的实用程序。 基础样式 ClassPropertiesbasis-0flex-basis: 0px;basis-1flex-basis: 0.25rem; /* 4px */basis-2flex-basis: 0.5rem; /* 8px */basis-3flex-basis:…

JDBC 学习笔记(一)基础篇 - JDBC 搭建的六大步骤

JDK 版本使用&#xff1a;JDK 21 框架思想&#xff1a;实体类及ORM思想 反射技术&#xff1a;BaseDAO 封装的过程 解决现有问题的角度&#xff0c;主要是 JDBC的基础应用 一、、JDBC 可以解决的问题 1.1 数据存储的问题 解决数据长期的存储问题&#xff1a; 数据通过 I/O 流…

城市之旅:使用 LLM 和 Elasticsearch 简化地理空间搜索(一)

作者&#xff1a;来自 Elastic Philipp Kahr, Valentin Crettaz 这篇博文的本地部署实践 Jupyter notebook 请详细阅读文章 “城市之旅&#xff1a;使用 LLM 和 Elasticsearch 简化地理空间搜索&#xff08;二&#xff09;”。 探索如何从自然语言提问创建地理空间搜索。在下…

最新鸿蒙南北开发学习路线+学习资料分享

前言 5月29日&#xff0c;“千帆竞发启航 共筑鸿蒙生态”鸿蒙原生应用合作仪式在北京成功举办&#xff0c;近40个应用现场官宣启动鸿蒙原生应用开发。此次官宣启动开发的鸿蒙原生应用不仅包括教育、母婴、出行、医疗健康等多领域的知名应用&#xff0c;还有十多家企业内部办公应…

OverlayFS在嵌入式系统中的应用

文章目录 抛出问题基本概念使用场景OverlayFS的详细介绍框架目录合并修改文件删除文件添加文件小结 OverlayFS在嵌入式系统中的应用内核配置OverlayFS简单应用OverlayFS应用新思路 总结 环境介绍 硬件&#xff1a;T113平台 软件&#xff1a;Tina5.0 SDK&#xff08;使用的build…

【第3章】SpringBoot实战篇之登录接口(含JWT和拦截器)

文章目录 前言一、JWT1. 什么是JWT2. 使用场景3. 结构3.1 Header3.2 Payload3.3 Signature 4. 使用 二、案例1.引入库2.JwtUtils3. UserController14. ArticleController 三、拦截器1. 定义拦截器2. 注册拦截器 四、测试1. 登录2. 无token3. 有token4. 全局配置 总结 前言 前面…

485通讯网关

在工业自动化与智能化的浪潮中&#xff0c;数据的传输与交互显得尤为重要。作为这一领域的核心设备&#xff0c;485通讯网关凭借其卓越的性能和广泛的应用场景&#xff0c;成为了连接不同设备、不同协议之间数据转换和传输的桥梁。在众多485通讯网关中&#xff0c;HiWoo Box以其…

postman教程-10-使用cookie

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了Postman Authorization授权的几种方法&#xff0c;本小节我们讲解一下Postman 使用cookie的方法。 Postman 的 cookie 管理器使您能够查看和编辑与不同域关联的 cookie。您可以为域手动创建 c…

软件测试、测试模型、测试用例

软件开发的五个模型 瀑布模型&#xff08;Waterfall Model&#xff09; 瀑布模型是所有其他模型的基础框架&#xff0c;瀑布模型的每个阶段都只执行一次&#xff0c;因此是线性顺序进行的开发模式优点&#xff1a;强调开发的阶段性&#xff1b; 强调早期计划及需求调查&#…

【Python实战】使用postman测试flask api接口

cookie_demo.py # -*- coding: utf-8 -*- """ Time : 2024/5/28 17:14 Author : 娜年花开 File : cookie_demo.py Desc : 需求&#xff1a;用户需要先登陆&#xff0c;登陆之后&#xff0c;通过Cookie来判断是不是能够访问登录后的接口userinfo &quo…

TMS FNC WX Pack TMS软件分发的一组应用程序

TMS FNC WX Pack TMS软件分发的一组应用程序 TMS FNC WX Pack是由TMS软件分发的一组应用程序。这些活动是100%的跨平台和跨Frimorc&#xff0c;并在不同的应用程序中得到支持&#xff0c;如Web应用程序、Windows、Linux等。阿拉伯语视觉组件库。安装这些计算机的过程非常简单高…

第四讲 单片机STC89C52+RA8889代码移植范例(包含API接口)

本次介绍单片机STC89C52RA8889代码移植范例&#xff0c;该范例已将RA8889的API移植好了&#xff0c;下方提供下载地址。 硬件平台&#xff1a;89C52RA8889 采用SPI通信方式 (已测试通过&#xff09; 上一讲已经阐述RA8889移植到51单片机的基本方法&#xff0c;本讲增加了API…

【第一节】数据结构和算法绪论

目录 一、数据结构的起源与发展 二、什么是数据结构 三、数据的逻辑结构和存储结构 四、数据类型和数据结构 五、算法 六、算法与数据结构的关系 七、算法时间复杂度和空间复杂度 一、数据结构的起源与发展 数据结构的起源可以追溯至1968年。当时&#xff0c;美国的唐欧…

Spring Security 注册过滤器注意事项

前两天和小伙伴聊了 Spring SecurityJWT 实现无状态登录&#xff0c;然后有小伙伴反馈了一个问题&#xff0c;感觉这是一个我们平时写代码容易忽略的问题&#xff0c;写一篇文章和小伙伴们聊一聊。 一 问题复原 先来说问题吧&#xff0c;在 Spring SecurityJWT 登录中&#x…

C++入门5——C/C++动态内存管理(new与delete)

目录 1. 一图搞懂C/C的内存分布 2. 存在动态内存分配的原因 3. C语言中的动态内存管理方式 4. C内存管理方式 4.1 new/delete操作内置类型 4.2 new/delete操作自定义类型 1. 一图搞懂C/C的内存分布 说明&#xff1a; 1. 栈区&#xff08;stack&#xff09;&#xff1a;在…

【C语言】位段(结构体实现位段)

目录 一、位段的定义 二、位段的声明 三、位段的内存分配 四、位段在内存中的存储方式 五、位段的优点 六、位段的跨平台问题 七、位段的应用 八、位段使用的注意事项 一、位段的定义 信息的存取一般以字节为单位。实际上&#xff0c;有时存储一个信息不必用一个或多个字…