保护模式下的内存访问(笔记)

news2024/10/6 8:37:59
         ;代码清单12-1
         ;文件名:c12_mbr.asm
         ;文件说明:硬盘主引导扇区代码
         ;创建日期:2011-5-16 19:54;修改于2022-02-16 11:15

         ;设置堆栈段和栈指针
         mov ax, cs
         mov ss, ax
         mov sp, 0x7c00

         ;计算GDT所在的逻辑段地址
         mov ax, [cs: gdt_base + 0x7c00]              ;低16位
         mov dx, [cs: gdt_base + 0x7c00 + 0x02]       ;高16位
         mov bx, 16
         div bx

         mov ds, ax                                   ;令DS指向该段以进行操作
         mov bx, dx                                   ;段内起始偏移地址

         ;创建0#描述符,它是空描述符,这是处理器的要求
         mov dword [bx+0x00],0x00
         mov dword [bx+0x04],0x00

         ;创建#1描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区)
         mov dword [bx+0x08],0x8000ffff
         mov dword [bx+0x0c],0x0040920b

         ;初始化描述符表寄存器GDTR
         mov word [cs: gdt_size+0x7c00],15            ;描述符表的界限(总字节数减一)

         lgdt [cs: gdt_size+0x7c00]

         in al,0x92                                   ;南桥芯片内的端口
         or al,0000_0010B
         out 0x92,al                                  ;打开A20

         cli                                          ;保护模式下中断机制尚未建立,应
                                                      ;禁止中断
         mov eax,cr0
         or eax,1
         mov 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 0
         gdt_base         dd 0x00007e00               ;GDT的物理地址

         times 510-($-$$) db 0
                          db 0x55,0xaa

根据上一篇我们讲到的内容继续
你会发现,控制实模式和保护模式切换的开关原是在一个叫CR0的寄存器
在这里插入图片描述

CR0

CR0是处理器内部的控制寄存器,之所以有个“0”后缀,是因为还有CR1,CR2,CR3…控制寄存器,到CR8
CR0是32位寄存器,包含了一系列用于控制处理操作模式和运行状态的标志位
如下
在这里插入图片描述

PE位

如果它的第1位为保护模式允许位,是开启保护模式的关键,如果为1,则处理器进入保护模式。
这里我们先只介绍这个
在保护模式下的中断和实模式下的中断不同,原有的中断向量表不再适用,而且必须要知道的是,BIOS中断都不能再使用。
所以你会看到37行
在这里插入图片描述
8086的段寄存器是16位的,共有四个:CS、DS、ES、SS
32位处理器内,在原有的基础上又增加了FS和GS

在这里插入图片描述

不可见部分是段的线性基址、界限、属性

段选择子

在保护模式下访问一个段时,传送到段寄存器的是段选择子
在这里插入图片描述由上图我们可以看到
它由三部分构成

  • 描述符索引号(Index)
  • TI描述符指示器(Table Indicator)
    当TI=0时,表示描述符在GDT中
    当TI=1时,描述符在LDT中
    LDT和GDT类似
  • PRT请求特权级

我们可以看到12-1的代码清单,定义了1个段描述符,因为表内描述符的编号是从0开始的,所以它的索引号是1
在45、46行,将描述符选择子0x0008传送到段选择器DS中,代码中用的是二进制
从二进制可以看到,指定描述符号的索引值号是1,指定的是GDT,请求特权级PRT为00
在这里插入图片描述
GDT的线性基址在GDTR中,又因为每个描述符占8字节,因此描述符在表内的偏移地址是索引号乘以8
在这里插入图片描述下图是保护模式下内存访问
在这里插入图片描述保护模式下处理器取指令的过程
在这里插入图片描述
在进入保护模式前,处理器就已经使用CS描述符高速缓存器里的基址从代码段取指令并执行指令

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

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

相关文章

树(数据结构篇)

数据结构之树 树 本篇讲的树也就是多叉树 普通树(多叉树) 概念: 树就是由根节点(父亲)分出多个分支节点(儿子),然后分支又分出多个分支,我们将这种结构称为树,树也可以这么定义:一棵树由称作根的节点r以及0个或多个非空的(子…

滴漏智能监测报警摄像机

智能监测摄像机在现代城市安全管理中扮演着关键角色。这些先进设备利用高度精确的图像识别技术,实时监测各类安全隐患,特别是在防疫措施中的应用日益显著。滴漏智能监测报警摄像机作为其中的一种,具备了多重功能,极大地增强了公共…

【Golang - 90天从新手到大师】Day06 - 数组

系列文章合集 Golang - 90天从新手到大师 数组是golang中最常用的一种数据结构,数组就是同一类型数据的有序集合 定义一个数组 格式: var name [n]type n为数组长度,n>0 且无法修改,type为数组的元素类型如: var a [2]int上面的例子定义了一个长度为2,元素类型为int的数组…

SpringBoot的配置文件和YAML文件的语法

1.SpringBoot的有两种格式的全局配置文件,使用任何一个功能都是一样的 注意:SpringBoot的全局配置文件名都是固定的application.xxx ① application.properties, 这个是默认Spring initializr默认自动生成的配置文件,也是我们属…

机器学习参数寻优:方法、实例与分析

机器学习参数寻优:方法、实例与分析 机器学习模型的性能很大程度上依赖于其参数的选择。参数寻优(Hyperparameter Tuning)是提升模型表现的关键步骤之一。本文将详细介绍主流的参数寻优方法,包括网格搜索(Grid Search)、随机搜索(Random Search)、贝叶斯优化(Bayesia…

Java中的do-while循环及其示例

Java中的do-while循环及其示例 在上一个教程中,我们讨论了while循环。在本教程中,我们将讨论java中的do-while循环。do-while循环类似于while循环,但它们之间有区别:在while循环中,条件是在执行循环体之前求值的&am…

1分钟带你部署本地Llama3大模型

介绍 LLaMa 3由Meta于2024年4月18日正式发布,这一版本是对先前LLaMa系列的重大升级。新发布的模型包括8B(80亿参数)和70B(700亿参数)两个版本,这两个版本在一系列行业标准基准测试中展示了最先进的性能。 从…

Jenkins 发测试邮件报错 553 Mail from must equal authorized user

Jenkins 发测试邮件报错 553 Mail from must equal authorized user 报错信息报错原因解决办法 报错信息 org.eclipse.angus.mail.smtp.SMTPSenderFailedException: 553 Mail from must equal authorized user at org.eclipse.angus.mail.smtp.SMTPTransport.mailFrom(SMTPTra…

EasyRecovery软件帮你轻松找回丢失的信息!即使是电脑小白也能轻松上手。

🎉【数据恢复,EasyRecovery帮你轻松找回丢失的信息!】🎉 大家好~👋今天我要来安利一款超级实用的软件——EasyRecovery数据恢复工具!作为经常跟各种数据打交道的你们,是不是也有过误…

【Windows Server】设置远程连接数量

打开运行(快捷键WinR)输入gpedit.msc打开“本地组策略编辑器” 依次点选【计算机配置】——【管理模板】——【Windows组件】——【远程桌面服务】——【远程桌面会话主机】——【连接】 双击“限制连接的数量”选择“已启用”,允许的RD最…

0.4 隔行扫描(Interlaced Scan)简介

0.4 隔行扫描简介 隔行扫描(Interlaced Scan)是一种将图像显示在扫描式的显示设备上的方法,例如阴极射线管(CRT)。 隔行扫描设备交替扫描图像的奇场(图像的所有奇数行,1、3、5)和偶…

SpringMVC框架学习笔记(八):自定义拦截器和异常处理

1 自定义拦截器 1.1 什么是拦截器 1.1.1 说明 (1)Spring MVC 也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定 的功能. (2)自定义的拦截器必须实现 HandlerInterceptor 接口 1.1.2 自定义拦截…

[创业之路-118] :制造业企业的必备管理神器-ERP-主要功能模块说明与系统架构

目录 一、ERP功能的标准化 二、常见的ERP标准化功能 2.1 基础档案 2.2 供应链 2.3 人力资源管理 2.4 资产管理 2.5 生产制造 2.6 财务会计 2.7 管理会计 2.8 CRM客户管理管理 2.9 商业智能分析 三、常见的ERP软件供应商 国内ERP软件供应商 国外ERP软件供应商 四…

Flutter框架高阶——Window应用程序设置窗体窗口背景完全透明

文章目录 1.修改 main.cpp1)C 与 Win32 API2)EnableTransparency()3)中文注释 2.编写 Flutter 代码1)bitsdojo_window2)window_manager3)区别对比4)同时使用(1)设置初始化…

做金蝶BI数据分析?后悔没早遇到这套方案

金蝶ERP是企业信息化管理的核心平台,在企业管理上有着十分重要的地位;而BI数据可视化工具同样在企业管理中扮演着至关重要的角色,通过将复杂数据转化为直观、易懂的图形和报表,推动企业高效、精准科学化决策。金蝶、BI两者结合&am…

使用二进制安装安装docker

在一些情况下无法使用yum安装docker下面写了一个使用二进制安装docker的文档 官网下载地址https://download.docker.com/linux/static/stable/x86_64/ 可以按需求下载 wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.10.tgz 下载包 tar xf dcker…

JAVA小知识27:异常与异常处理全解

一、异常 异常就是代表程序出现了问题,像我们之前学数组的时候碰到的数组越界异常,以及空指针异常等等都属于开发中经常能碰到的异常。 我们学习异常不是为了在以后中避免异常,而是学习碰到了异常以后该如何的处理。 1.1、异常的分类 Java…

InPixio Photo Cutter v10 解锁版安装教程 (懒人抠图工具)

前言 InPixio Photo Cutter是一款懒人抠图工具,采用了增强的算法切割技术,可以在不影响图像质量的情况下,允许用户从照片中删除任何物体或人物,并且保持其完整的质量。你只需点击几下鼠标,便可从照片中剪下任何细节、…

Linux驱动开发(二)--字符设备驱动开发提升 LED驱动开发实验

1、地址映射 在编写驱动之前,需要知道MMU,也就是内存管理单元,在老版本的 Linux 中要求处理器必须有 MMU,但是现在Linux 内核已经支持无 MMU 的处理器了。 MMU的功能如下: 完成虚拟空间到物理空间的映射 内存保护&…

安卓手机删除的照片怎么恢复?3个方法,小技巧大作用

你是否曾经不小心删除了手机里的珍贵照片,却不知道怎么恢复?别担心,今天我们就来分享几个简单的小技巧,帮助你轻松找回那些丢失的照片。这些技巧虽然简单,但却能发挥大作用,让你不再为丢失照片而烦恼。手机…