第十课 实模式到保护模式 上

  远古时期的程序开发是直接操作物理内存的,CPU指令的操作数直接使用实地址(实际内存地址),程序员拥有绝对的权利,可以随意访问内存的任意一个地址,可以说是指哪打哪。

  使用绝对的物理地址会带来很多问题,例如:

1、难以重定位,程序每次都需要同样地址的内存来运行。

2、给多道程序设计带来了障碍,也就是说,不管内存多大,但凡一个字节被其他程序占用都无法执行。

  为了解决以上的问题,英特尔开发出了8086 CPU处理器,其引入了如下特性:

1、地址线宽度为20位,可访问1M内存空间

2、引入[段地址:偏移地址] 的内存访问方式

  8086的段寄存器和通用寄存器为16位

  单个寄存器寻址最多访问64K的内存空间

  需要两个寄存器配合,完成所有内存空间的访问

下面我们来研究一下  段地址:偏移地址  的访问方式,其中硬件会做如下工作:

  段地址左移4位,构成20位的基地址,也就是起始地址,这正好和20根地址线对应上

  基地址 + 偏移地址 = 实地址

段地址 :偏移地址的访问方式对开发者具有很大的意义:

  更有效的划分内存的功能(数据段、代码段等)

  当出现程序地址冲突时,通过修改段地址解决冲突,给重定位带来了方便

段地址:偏移地址的示例如下:

  默认情况下,数据访问的段地址存在ds寄存器中,我们也可以显式的给出,例如把段地址放到es寄存器中。

  段地址:偏移地址的访问方式会产生一点小问题,例如,[段地址:偏移地址]能访问的最大地址为0xFFFF:0xFFFF,按照求实地址的方法得到最终的地址为10FFEF,这已经超过了1MB的空间,那么CPU如何进行处理呢?

看下面的推导:

  0xFFFF:0xFFFF

    ->0xFFFF0 + 0xFFFF

      ->0xFFFF0 + (0xF + 0xFFF0)

        ->(0xFFFF0 + 0xF) + 0xFFF0

上面的0xFFFF0 + 0xF已经是1MB内存的最大地址了,再加上0xFFF0已经超出了物理内存大小,这超出的部分在8086中称为高端地址区(HMA)。

  上面的地址已经超过了20位,8086怎么处理呢?由于8086只有20位地址线,因此最高位被丢弃(溢出),如下所示:

  8086是一款非常成功的产品,因此,拥有一大批的开发者和应用程序,各种基于8086程序设计的技术得到了发展,同时,各种奇淫技巧也应运而生,虽然8086解决了程序重定位的问题,但还是存在很多其他的问题:

1、1MB的内存完全不够用

2、开发者在程序中大量使用内存回卷技术(HMA地址被使用)

3、应用程序之间没有界限,相互之间随意干扰

  A程序可以随意访问B程序中的数据

  C程序可以修改系统调度程序的指令

为了解决以上问题,英特尔的第二代CPU被开发出来,也即80286,8086已经有很多程序在运行了,因此,80286必须兼容8086,而且80286地址线的数量增加到了24位,[段地址:偏移地址]的访问方式也得到了强化:

  1、为每一个段提供了更多的属性(如范围、特权级等)

  2、为每个段的定义提供固定方式

默认情况下80286是完全兼容8086的运行方式(实模式),例如,默认可以访问1MB的内存空间、通过特殊的方式可以访问1MB+的内存空间。

这个特殊的方式就是使80286运行在保护模式下,实模式和保护模式有如下不同:

保护模式:

  1、每一段内存拥有一个属性定义(描述符Descriptor)

  2、所有段的属性定义构成一张表(描述符表Descriptor Table)

  3、段寄存器保存的是段属性定义在表中的索引(选择子Selector)

描述符的内存结构如下:

描述符表如下:

选择子的结构如下:

80286进入保护模式的方式如下:

1、定义描述符表

2、打开A20地址线,使CPU支持24位地址

3、加载描述符表

4、通知CPU进入保护模式(通过设置CPU中的某个寄存器实现)

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9331088.html

时间: 2024-10-26 16:11:32

第十课 实模式到保护模式 上的相关文章

《80X86汇编语言程序设计教程》十 实模式与保护模式的切换实例

1.  再次声明,需要纯DOS系统才能看到满意测试效果.内容是演示实模式与保护模式切换实例,实现功能是16进制显示从110000H开始的256个字节的值 2.  源代码如下: 1 ;功能:演示实模式与保护模式的切换,16进制显示从110000H开始的256个字节的值 2 ;16位偏移的段间直接转移指令的宏定义,这是一个JMP指令到所描述的地址 3 4 JUMP macro selector,offsetv 5 db 0eah ;操作码 6 dw offsetv ;16位偏移 7 dw selec

【OS】实模式和保护模式区别及寻址方式

实模式和保护模式区别及寻址方式 转载请注明出处:http://blog.csdn.NET/rosetta 64KB-4GB-64TB? 我记得大学的汇编课程.组成原理课里老师讲过实模式和保护模式的区别,在很多书本上也有谈及,无奈本人理解和感悟能力实在太差,在很长一段时间里都没真正的明白它们的内含,更别说为什么实模式下最大寻址空间为1MB?段的最大长度不超过64KB?而保护模式下为啥最大寻址能力就变成了64TB?每个段最大也达4GB? 更甚者分段和分页这两个高深的概念像我这种菜鸟怎么也理解不了啊!

存储器的保护(三)——《x86汇编语言:从实模式到保护模式》读书笔记20

存储器的保护(三) 改动本章代码清单,使之能够检測1MB以上的内存空间(从地址0x0010_0000開始,不考虑快速缓存的影响).要求:对内存的读写按双字的长度进行.并在检測的同一时候显示已检測的内存数量.建议对每一个双字单元用两个花码0x55AA55AA和0xAA55AA55进行检測. 上面的文字选自原书第12章的习题1. 这篇博文就讨论一下这道题.由于是初学,我不正确自己做太高的要求.仅仅要实现功能就可以. 代码清单 ;文件说明:第12章习题-1 ;创建日期:2016-3-7 ;------

【自制操作系统04】从实模式到保护模式

通过前三章的努力,我们成功将控制权转交给了 loader.asm 这个程序.具体说就是 bios 通过加载并跳转到 0x7c00(IMB大叔们定的) 把控制权转交给了我们操作系统的第一个汇编程序 mbr.asm,然后 mbr.asm 里做的事就是通过加载 loader 程序并跳转到 0x900(这个是我们自己定的)把控制权转交给了 loader.asm 程序,目前这个程序里还只是向屏幕输出一行字符串"loader",今天我们就将扩展它.并且今天我们要做的事,是操作系统中的第一个精彩之处

程序的加载和执行(六)——《x86汇编语言:从实模式到保护模式》读书笔记26

程序的加载和执行(六)--<x86汇编语言:从实模式到保护模式>读书笔记26 通过本文能学到什么? NASM的条件汇编 用NASM编译的时候,通过命令行选项定义宏 Makefile的条件语句 在make命令行中覆盖Makefile中的变量值 第13章习题解答 复习如何构造栈段描述符 我们接着上篇博文说. 在我修改后的文件中,用到了条件汇编. 比如: %ifdef DEBUG put_core_salt: ;打印内核的符号 ... ... put_usr_salt: ;打印用户的符号 ... .

Linux进程5——实模式和保护模式

早期的Inter芯片只支持1MB内存,采用实模式,采用16bit地址.后来随着技术进步,出现可以访问更多内存的 保护模式芯片,采用32bit地址.为了保持对前面芯片的兼容,Inter支持这两种模式.当芯片启动时,默认处于实模式, 然后OS控制进入保护模式. 实模式和保护模式的最大区别: 实模式下,程序地址为真实的物理地址,可以访问任意地址空间,这样不同进程可能访问到其它进程程序,造成 严重错误. 保护模式下,程序地址为虚拟地址,然后由OS系统管理内存访问权限,这样每个进程只能访问分配给自己的物理

Linux-0.11源代码阅读二 实模式到保护模式

bootsect部分已经执行完成,程序也跳转到setup部分: start: ! ok, the read went well so we get current cursor position and save it for ! posterity. mov ax,#INITSEG ! this is done in bootsect already, but... mov ds,ax mov ah,#0x03 ! read cursor pos xor bh,bh int 0x10 ! sa

程序的载入和运行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25

程序的载入和运行(五)--<x86汇编语言:从实模式到保护模式>读书笔记25 前面几篇博文最终把代码分析完了.这篇就来说说代码的编译.运行和调试. 1.代码的编译及写入镜像文件 之前我们都是在命令行输入命令进行编译和写入.源文件少的时候还不认为麻烦,当源文件多了,就会认为特别麻烦.有没有简单的方法呢? 当然有,就是用make工具. 1.1.什么是make工具 make是一个命令工具,它解释Makefile中的指令.在Makefile文件里描写叙述了整个project全部文件的编译顺序.编译规则

存储器的保护(一)——《x86汇编语言:从实模式到保护模式》读书笔记18

本文是原书第12章的学习笔记. 说句题外话,这篇博文是补写的,因为让我误删了,可恶的是CSDN的回收站里找不到! 好吧,那就再写一遍,我有坚强的意志.司马迁曰:“文王拘而演<周易>:仲尼厄而作<春秋>:屈原放逐,乃赋<离骚>:左丘失明,厥有<国语>:孙子膑脚,<兵法>修列:不韦迁蜀,世传<吕览>……”好了,不煽情了,进入正题. 第12章的代码如下. 1 ;代码清单12-1 2 ;文件名:c12_mbr.asm 3 ;文件说明:硬盘主引