认识保护模式

news2024/9/21 22:43:27

认识保护模式

为什么需要保护模式

  • Intel 8086是16位CPU,它有着16位的寄存器,16位的数据总线以及20位的地址总线和1MB的寻址能力。
  • 从80386开始CPU进入32位时代,寻址能力达到4GB,无法使用16位寄存器完成寻址

GDT(global descriptor table)

而保护模式下,虽然段值仍然由原来16位的cs、ds等寄存器表示,但此时它仅仅变成了一个索引,这个索引指向一个数据结构的一个表项,表项中详细定义了段的起始地址、界限、属性等内容。这个数据结构,就是GDT.

描述符(Descriptor)

GDT的作用是用来提供段式存储机制,这种机制是通过段寄存器和GDT中的描述符共同提供的。

描述符的结构

image-20240910135918638

  • 段基址:规定线性地址空间中段的开始地址。在保护模式下,段基地址长32位。因为基地址长度与寻址地址的长度相同,所以段基地址可以是 0~4GB 范围内的任意地址,而不像实方式下规定的边界必须被16整除。
  • 段界限:段界限规定段的大小。在保护模式下,段界限决定了偏移量的最大值。对于向下扩展的段,如堆栈段来说, 段界限决定了偏移量的最小值。
[SECTION .gdt]
; GDT
;                              段基址 ,       段界限     , 属性
LABEL_GDT:	   Descriptor       0    ,            0	   , 0           ; 空描述符
LABEL_DESC_CODE32: Descriptor       0, SegCode32Len - 1, DA_C + DA_32; 非一致代码段
LABEL_DESC_VIDEO:  Descriptor 0B8000h,           0ffffh, DA_DRW	     ; 显存首地址
; GDT 结束

GdtLen		equ	$ - LABEL_GDT	; GDT长度
GdtPtr		dw	GdtLen - 1	; GDT界限
		dd	0		; GDT基地址

; GDT 选择子
SelectorCode32		equ	LABEL_DESC_CODE32	- LABEL_GDT
SelectorVideo		equ	LABEL_DESC_VIDEO	- LABEL_GDT
; END of [SECTION .gdt]

pmtest1.asm中定义了如上的GDT,包括:

  • 三个描述符:空描述符 非一致代码段 显存首地址,并赋予段基址 段界限 属性 的初值
  • GDT长度
  • GDT指针:包括GDT界限和GDT基地址
  • GDT选择子:包括非一致代码段选择子 显存首地址选择子

选择子(selector)

image-20240910141437914

; GDT 选择子
SelectorCode32		equ	LABEL_DESC_CODE32	- LABEL_GDT
SelectorVideo		equ	LABEL_DESC_VIDEO	- LABEL_GDT

对于上面的代码片段,TiRPL都是0的时候,选择子可以看做是描述符相对于GDT基地址的偏移

段式寻址

理解[SECTION .s16]程序的关键是要明白此时CPU仍然处于实模式,此时最大的寻址范围仍然是1M,因此可以用cs寄存器存储

[SECTION .s16]
[BITS	16]
LABEL_BEGIN:
	mov	ax, cs				;cs为0
	mov	ds, ax
	mov	es, ax
	mov	ss, ax
	mov	sp, 0100h

这一节程序是用cs中存储的段基址(即LABEL_BEGIN标签在内存中对应的地址)初始化ds es ss寄存器,并初始化sp寄存器

	; 初始化 32 位代码段描述符
	xor	eax, eax
	mov	ax, cs
	shl	eax, 4				  ;段基址(CS)左移四位
	add	eax, LABEL_SEG_CODE32 ;加上偏移地址(LABEL_SEG_CODE32)

这段程序利用如下公式算出LABEL_SEG_CODE32真实的逻辑地址并存储在eax中(此时仍然处于实模式,计算机的最大寻址空间仍然是1M)
逻辑地址 = 段基址 ∗ 16 + 偏移地址 逻辑地址=段基址*16+偏移地址 逻辑地址=段基址16+偏移地址

	;对照图3.4阅读
	mov	word [LABEL_DESC_CODE32 + 2], ax;BYTE2,3
	shr	eax, 16
	mov	byte [LABEL_DESC_CODE32 + 4], al;BYTE4
	mov	byte [LABEL_DESC_CODE32 + 7], ah;BYTE7

这段程序则是将eax(LABEL_SEG_CODE32的真实逻辑地址)赋值给BYTE2 BYTE3 BYTE4 BYTE7作为保护模式下描述符LABEL_DESC_CODE32的基地址

	; 为加载 GDTR 作准备
	xor	eax, eax
	mov	ax, ds					;ds = cs
	shl	eax, 4
	add	eax, LABEL_GDT			; eax <- gdt 基地址
	mov	dword [GdtPtr + 2], eax	; GDT基地址([GdtPtr + 2]) <- gdt 基地址

这段程序是将GDT的信息写入GDTPtr指针

首先计算出LABEL_GDT对应的内存地址,然后将GdtPtr对应的基地址赋值为LABEL_GDT的真实的内存地址

	lgdt	[GdtPtr]

这段程序是将GdtPtr加载到gdtr寄存器当中,gdtr寄存器的格式如下图所示

image-20240910151254302

	; 在保护模式下,如果不关终端程序会发生错误
	cli

	; 打开地址线A20,才能访问所有的内存空间
	in	al, 92h
	or	al, 00000010b
	out	92h, al
  • 问:什么是A20?
  • 答:这是一个历史问题。
    • 8086中,“段:偏移”这样的模式能表示的最大内存是FFFF:FFFF,即10FFEFh。可是8086只有20位的地址总线,只能寻址到1MB,那么如果试图访问超过1MB的地址时会怎样呢?实际上系统并不会发生异常,而是回卷(wrap)回去,重新从地址零开始寻址。可是,
    • 到了80286时,真的可以访问到1MB以上的内存了,如果遇到同样的情况,系统不会再回卷寻址,这就造成了向上不兼容.
    • 为了保证百分之百兼容,IBM想出一个办法,使用8042键盘控制器来控制第20个(从零开始数)地址位,这就是A20地址线,如果不被打开,第20个地址位将会总是零。
	; 准备切换到保护模式
	mov	eax, cr0
	or	eax, 1
	mov	cr0, eax

	; 真正进入保护模式
	jmp	dword SelectorCode32:0	; 执行这一句会把 SelectorCode32 装入 cs,
								; 并跳转到 Code32Selector:0  处

这段程序首先通过控制cr0寄存器的第0位(PE标志位:1为实模式,0为保护模式)切换到保护模式

然后使用jmp dword SelectorCode32:0跳转到实模式,将SelectorCode32LABEL_SEG_CODE32标志的真实物理地址当做保护模式的段基址

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

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

相关文章

《王者荣耀世界》不止在苹果16优化 多终端优化也在进行

易采游戏网9月10日消息&#xff1a;随着iPhone16的发布&#xff0c;全球手游玩家的目光再次聚焦于这款全新设备的性能表现。而作为国内游戏界的代表作之一&#xff0c;《王者荣耀世界》也将迎来一波重大的体验升级。这一次的优化并不只局限于iPhone16&#xff0c;实际上&#x…

客服宝:专业跨平台快捷回复软件

在这个信息爆炸的时代&#xff0c;客服工作的重要性不言而喻。然而&#xff0c;面对多渠道、高频率的咨询与互动&#xff0c;客服团队如何保持高效、专业且富有人情味的对话呢&#xff1f;客服宝——一款专业的跨平台快捷回复软件&#xff0c;以其独特的功能优势&#xff0c;为…

第三部分:4---进程地址空间

目录 数组的空间分配解析&#xff1a; 物理地址和虚拟地址&#xff1a; 虚拟地址空间&#xff1a; 进程地址空间的本质&#xff1a; 为什么要有进程地址空间&#xff1f; 页表对进程访问内存的检查&#xff1a; 进程地址空间和页表如何关联起来&#xff1f; 进程的独立…

源荷储再创新!小论文轻松发!基于雨流计数法的源-荷-储双层协同优化配置研究程序代码!

前言 如何实现源与荷信息互通&#xff0c;将传统的供需信息由静态传递向能源互联转变&#xff0c;形成能源互联网&#xff0c;是今后能源革命的变革方向。新电改的出台推动了能源互联网的发展&#xff0c;储能技术作为能源互联网发展中的关键元素&#xff0c;由于储能系统投资…

每个python程序员都应该早点知道的 6 个 Python 函数

在编程中&#xff0c;默认参数的引入使得函数调用更为灵活&#xff0c;不仅允许开发者在特定情况下省略某些非必需参数&#xff0c;同时也强调了对参数与实际传递值&#xff08;即论点&#xff09;之间区别的理解&#xff0c;这对于掌握函数工作机制至关重要。 此外&#xff0…

PCL-统计滤波

本篇内容 讲解统计滤波作用及原理通过pcl实现统计滤波强烈推荐在点云处理最开始使用&#xff0c;统计滤波处理&#xff0c;再送入其他算法进行处理&#xff01;&#xff01;&#xff01; 效果&#xff1a; 1 主要原理 手动设置半径大小或者邻域点数量N&#xff08;若设置的…

“论剑”智算时代,长沙已经站在计算产业的“华山之巅”

文 | 智能相对论 作者 | 陈泊丞 共赴全新十年之约&#xff0c;长沙又来搞大事情了&#xff01; 2024互联网岳麓峰会以“AI汇湘江 数智领航未来”为主题&#xff0c;全面聚焦在“AI”时代把握数字化、网络化、智能化发展机遇&#xff0c;积极响应当前人工智能技术迅猛发展的势…

【Qt笔记】QTableWidget控件详解

目录 引言 一、QTableWidget的特点 二、QTableWidget基础 2.1 引入QTableWidget 2.2 基本属性 三、代码示例&#xff1a;初始化QTableWidget 四、编辑功能 4.1 设置单元格为只读 4.2 响应内容更改 五、选择模式 六、样式定制 七、与其他控件的交互 7.1 在单元格…

网络工程师学习笔记——无线通信网(二)

MAC子层 包含逻辑链路层&#xff08;LLC&#xff09;和介质访问控制层&#xff08;MAC&#xff09;两个子层 无线访问机制 MAC子层是提供访问机制控制 <1>CSMA/CA是类似于802.3当中的CSMA/CD且支持竞争访问 为何不适用CSMA/CD ,因为有隐藏的节点和暴露的节点&#xf…

QT天气预报

json 理论 什么是JSON? 规则 被大括号包括的是JSON对象,被中括号包括的是JSON数组. JSON数组JSON对象 实验 构建JSON 用代码实现如下json内容: //构建JSON void WirteJson() {QJsonObject rootObject;//1.插入name字段rootObject.insert("name","china&quo…

新手必看,​7款常见的短视频剪辑软件附详细教程,一看就会!

视频剪辑已经成为了我们生活和工作中常见的需求之一&#xff0c;windows视频编辑软件有很多&#xff0c;从简单的剪辑到复杂的视觉效果制作&#xff0c;不同的视频剪辑软件满足不同剪辑需求。本文将详细介绍一些广泛使用的视频制作软件&#xff0c;包括它们的功能特点以及一些高…

前海打工人的免费公园停车场

现在桂湾公园地下停车场距离前海的搬砖的写字楼近一些也好一些&#xff0c;由于主打一个免费&#xff0c;故很多情况都被预约满了。我住的地方在宝安石岩&#xff0c;提前1小时预约根本就没办法到停车场。故我最近都是停前海运动公园的地面停车场【372个停车位】。但是这个地面…

全球视频云创新挑战赛算法赛道第一名比赛攻略

关联比赛: “新内容 新交互”全球视频云创新挑战赛--算法挑战赛道 Richardzuo比赛攻略 赛题背景与理解 视频物体分割&#xff08;Video Object Segmentation&#xff09;是计算机视觉最近两三年兴起的⼀个研究领域&#xff0c;其⽬的是从视频所有图像帧中把感兴趣的物体区域…

指针 (五)

一 . 字符指针变量 在指针的类型中&#xff0c;有一种是字符指针&#xff1a;char * &#xff0c;用法如下&#xff1a; 下面我们通过一道试题来加深理解&#xff1a; 看着这个运行结果&#xff0c;是不是跟自己心中预想的答案有一些出入呢&#xff1f;下面为诸君解读一下&…

VS中.NET项目中央包管理和多目标框架配置

引言 通常我们在做项目时会给不同的程序员分配不同的功能模块进行各自开发&#xff0c;当然要遵守一定的约定或同一的框架设计。这在同一个工程中就会出现不同的项目类库需要引用&#xff0c;而这些类库可能会引用一些Nuget包&#xff0c;对于这些包的管理如果都在每个项目中去…

凸优化学习(1)——什么是凸优化、凸集、凸函数

&#x1f345; 写在前面 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;这里是hyk写算法了吗&#xff0c;一枚致力于学习算法和人工智能领域的小菜鸟。 &#x1f50e;个人主页&#xff1a;主页链接&#xff08;欢迎各位大佬光临指导&#xff09; ⭐️近…

铲屎官都该知道的除浮毛神器——希喂、美的、352宠物空气净化器

为什么明明在南方&#xff0c;却能感受到北方柳絮漫天飞舞&#xff0c;鼻子被堵住的感觉&#xff1f;这都是家里的猫咪在作怪。最近我感觉家里的空气特别闷&#xff0c;打开窗户通风了很久都没什么用就没去管了。早上起来的时候鼻子异物感很重&#xff0c;甚至还咳嗽不止&#…

Android TextView 学习备忘

android:gravity 与 android:layout_gravity&#xff1a; Android TextView文本位置_mob649e8166858d的技术博客_51CTO博客https://blog.51cto.com/u_16175509/8597723

【重学 MySQL】三、RDBMS 和非 RDBMS

【重学 MySQL】三、RDBMS 和非 RDBMS 关系型数据库&#xff08;RDBMS&#xff09;关系型数据库的核心概念关系型数据库的优点关系型数据库的缺点 非关系型数据库&#xff08;非 RDBMS&#xff09;定义与特点主要特点常见类型应用场景优缺点NoSql 的演变早期阶段&#xff08;20世…

langgraph tool如何发送自定义事件

在工具调用过程中&#xff0c;如何将中间状态返回到的stream&#xff0c;可以使用from langchain_core.callbacks import dispatch_custom_event方法实现。示例如下 from langchain_core.callbacks import dispatch_custom_event from langchain_core.tools import tooltool d…