保护模式与实模式
内存寻址的三种模式
内存寻址的三种模型1. 地址的种类首先明确一下逻辑地址和线性地址这两个概念:1. 逻辑地址2. 线性地址3. 物理地址1.1 逻辑地址:逻辑地址是编译器生成的,我们使用在linux环境下,使用C语言指针时,指针的值就是逻辑地址。
对于每个进程而言,他们都有一样的进程地址空间,类似的逻辑地址,甚至很可能相同。
1.2 线性地址:线性地址是由分段机制将逻辑地址转化而来的,如果没有分段机制作用,那么程序的逻辑地址就是线性地址了。
1.3 物理地址物理地址是CPU在地址总线上发出的电平信号,要得到物理地址,必须要将逻辑地址经过分段,分页等机制转化而来。
2. 三种寻址模型x86体系结构下,使用的较多的内存寻址模型主要有三种:1. 实模式扁平模型real mode flat model2. 实模式分段模型real mode segment model3. 保护模式扁平模型protected mode flat model下面是对这三种模型的描述实模式和保护模式相对,实模式运行于20位地址总线,保护模式则启用了32位地址总线,地址使用的是虚拟地址,引入了描述符表;虽然二者都引入了段这样一个概念,但是实模式的段是64KB固定大小,只有16KB个不同的段,CS,DS等存储的是段的序号(想想为什么?)。
保护模式则引入了GDT和LDT段描述符表的数据结构来定义每个段。
扁平模型和分段模型相对,区别在于程序的线性地址是共享一个地址空间还是需要分成多个段,即为多个程序同时运行在同一个CS,DS的范围内还是每个程序都拥有自己的CS,DS:前者(flat)指令的逻辑地址要形成线性地址,不需要切换CS,DS;后者的逻辑地址,必须要经过段选择子去查找段描述符,切换CS,DS,才能形成线性地址。
3. 实模式扁平模型该模式只有在386及更高的处理器中才能出现!80386的实模式,就是指CPU可用的地址线只有20位,能寻址0~1MB的地址空间。
实模式与保护模式
实模式与保护模式在是模式下,16位寄存器需要用“段:偏移”这种方法才能达到1MB的寻址能力,如今我们有了32位寄存器,一个寄存器就可以寻址4GB的空间,是不是从此段值就被抛弃了?,在新的政策下地址仍然用“段:偏移”这样的形式来表示,只不过保护模式下的“段”的概念发生了根本性的变化,是模式下段值还是可以看成地址的一部分的,段值为XXXXh表示以XXXX0h开始的一段内存,而保护模式下虽然段值仍然由原来的16位的CS,DS等寄存器表示,但此时它仅仅变成了一个索引,这个索引指向一个数据结构的一个表项,表项中详细定义了段的起始地址,界限,属性等内容这个数据结构就是GDT(global description table)在Protected Mode下,一个重要的必不可少的数据结构就是GDT(Global Descriptor Table)。
为什么要有GDT?我们首先考虑一下在Real Mode下的编程模型:在Real Mode下,我们对一个内存地址的访问是通过Segment:Offset的方式来进行的,其中Segment是一个段的Base Address,一个Segment的最大长度是64 KB,这是16-bit系统所能表示的最大长度。
而Offset则是相对于此Segment Base Address的偏移量。
Base Address+Offset就是一个内存绝对地址。
由此,我们可以看出,一个段具备两个因素:Base Address和Limit(段的最大长度),而对一个内存地址的访问,则是需要指出:使用哪个段?以及相对于这个段Base Address的Offset,这个Offset应该小于此段的Limit。
当然对于16-bit系统,Limit不要指定,默认为最大长度64KB,而 16-bit的Offset也永远不可能大于此Limit。
我们在实际编程的时候,使用16-bit段寄存器CS(Code Segment),DS (Data Segment),SS(Stack Segment)来指定Segment,CPU将段积存器中的数值向左偏移4-bit,放到20-bit的地址线上就成为20-bit的Base Address。
【转】实模式和保护模式
【转】实模式和保护模式 为何要了解Intel 80386的保护模式和分段机制?⾸先,我们知道Intel 80386只有在进⼊保护模式后,才能充分发挥其强⼤的功能,提供更好的保护机制和更⼤的寻址空间,否则仅仅是⼀个快速的8086⽽已。
没有⼀定的保护机制,任何⼀个应⽤软件都可以任意访问所有的计算机资源,这样也就⽆从谈起操作系统设计了。
且Intel 80386的分段机制⼀直存在,⽆法屏蔽或避免。
其次,在我们的bootloader设计中,涉及到了从实模式到保护模式的处理,我们的操作系统功能(⽐如分页机制)是建⽴在Intel 80386的保护模式上来设计的。
如果我们不了解保护模式和分段机制,则我们⾯向Intel 80386体系结构的操作系统设计实际上是建⽴在⼀个空中楼阁之上。
【注意】虽然⼤家学习过X86汇编,对X86硬件架构有⼀定了解,但对X86保护模式和X86系统编程可能了解不够。
为了能够清楚了解各个实验中汇编代码的含义,我们建议⼤家阅读如下参考资料:可先回顾⼀下lab0-manual中的“了解处理器硬件”⼀节的内容。
《Intel 80386 Reference Programmers Manual-i386》:第四、六、九、⼗章。
在后续实验中,还可以进⼀步阅读第五、七、⼋等章节。
(1) 实模式 在bootloader接⼿BIOS的⼯作后,当前的PC系统处于实模式(16位模式)运⾏状态,在这种状态下软件可访问的物理内存空间不能超过1MB,且⽆法发挥Intel 80386以上级别的32位CPU的4GB内存管理能⼒。
实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,操作系统和⽤户程序并没有区别对待,⽽且每⼀个指针都是指向实际的物理地址。
这样,⽤户程序的⼀个指针如果指向了操作系统区域或其他⽤户程序区域,并修改了内容,那么其后果就很可能是灾难性的。
通过修改A20地址线可以完成从实模式到保护模式的转换。
详解实模式,保护模式,虚拟8086模式
2014年11月29日 0:59
• 80x86处理器有三种工作模式:实模式,保护模式和虚拟8086模式
• 历史 ○ DOS时代,汇编凭借着特权可以随时访问系统内核,直接操作硬件,对系统安全造成威胁 ○ Windows时代的到来,不仅给我们带来了华丽的界面,更多的是给我们带来了“保护机 制”。将系统内核层层封装,用户仅能通过Windows提供的接口访问内核。即保护模式 ○ 为了兼容以前的MS-DOS程序,虚拟86模式应运而生。虚拟8086模式是以任务形式在保护模式 上执行的, 在80386上可以同时支持由多个真正的80386任务和虚拟8086模式构成的任务 ○ 其实,实模式和虚拟8086模式是为了向下兼容而设置的. 而保护模式是我们的主角, 是我们现
实际上, 80386就是通过在实模式下初始化控制寄存器, GDTR, LDTR, IDTR与TR等管理寄存 器以及页表, 然后再通过加载CR0使其中的保护模式使能位置位而进入保护模式的. 当然, 实模式下不支持硬件上的多任务切换
实模式下的中断处理方式和8086处理器相同, 也用中断向量表来定位中断服务程序地址 中断向量表的结构也和8086处理器一样: 每4个字节组成一个中断向量, 其中包括两个字节
○ 虚拟8086模式是以任务形式在保护模式上执行的, 在80386上可以同时支持由多个真正的 80386任务和虚拟8086模式构成的任务。虚拟8086模式以保护模式为基础, 它的工作方式实际 上是实模式和保护模式的混合
• 实模式
○ 以8086架构进行讲解,8086上一代8088 CPU中的寄存器都是8位的。而8086是16位的,是
显示的视频缓冲区和BIOS的地址空间
• 而在内存低端, 安排了中断向量表和BIOS数据区; 剩下从
保护模式详解
保护模式详解在ia32下,cpu有两种⼯作模式:实模式和保护模式。
在实模式下,16位的寄存器⽤“段+偏移”的⽅法计算有效地址。
段寄存器始终是16位的。
在实模式下,段值xxxxh表⽰的以xxxx0h开始的⼀段内存。
但在保护模式下,段寄存器的值变成了⼀个索引(还有附加信息)这个索引指向了⼀个数据结构的表(gdt/ldt)项,表项(描述符)中详细定义了段的其实地址、界限、属性等内容。
保护模式需要理解:描述符,选择⼦描述符包括,存储段描述符(代码段,数据段,堆栈段),系统描述符(任务状态段TSS,局部描述符表LDT),门描述符(调⽤门,任务门,中断门,陷阱门),下⾯以存储段描述符位例我们看⼀下描述符的结构:描述符共8个字节:0,1字节是段界限(2字节)2,3,4字节是段基址的低24位(3字节)5,6字节是段基址的属性(2字节)7字节是段机制的⾼8位(1字节)属性:(1) P:存在(Present)位。
P=1 表⽰描述符对地址转换是有效的,或者说该描述符所描述的段存在,即在内存中;P=0 表⽰描述符对地址转换⽆效,即该段不存在。
使⽤该描述符进⾏内存访问时会引起异常。
(2) DPL: 表⽰描述符特权级(Descriptor Privilege level),共2位。
它规定了所描述段的特权级,⽤于特权检查,以决定对该段能否访问。
(3) DT:说明描述符的类型。
对于存储段描述符⽽⾔,DT=1,以区别与系统段描述符和门描述符(DT=0)。
(4) TYPE: 说明存储段描述符所描述的存储段的具体属性。
数据段类型类型值说明----------------------------------0只读1只读、已访问2读/写3读/写、已访问4只读、向下扩展5只读、向下扩展、已访问6读/写、向下扩展7读/写、向下扩展、已访问选择⼦的结构:RPL(Requested Privilege Level): 请求特权级,⽤于特权检查。
保护模式知识
保护模式知识序!对于学习任何编程语言的朋友来说掌握CPU的操作模式都是一件非常重要的事,其中就数保护模式这部分最重要了,现在关于保护模式的中文资料就只有杨季文先生那一家还算全面,但有些人还是觉得看不太懂,为此我就写了这篇文章,看看是否对您的胃口!一、保护模式概述顾名思义,就是对程序的运行加以保护。
我们知道在实模式下通常只能寻址1M的内存空间,且只能是单任务,就是说同一时间不能有两个任务被激活。
从8086/8088的20根地址线,80286的24根地址线到80386的32根地址线,直至今天Puntium4已经发展到了36根地址线,它们分别可以寻址1M、16M、4G、64G的内存空间,然而在实模式下,通常的寻址范围还是1M。
也就是对于在纯DOS下运行的Puntium4也只能是一个快速的8086。
前面已经说了,保护模式就是对程序的运行加以保护,所以说保护模式较实模式的增强的最主要体现还不是寻址能力而是对多任务的支持,所提到的保护就是对不同任务间和同一任务内的程序加以保护,使它们的运行不受对方“有意”或“无意”影响,但同时也要对两个任务都要用到的部分代码实现共享。
另外一个重要的增强就是对虚拟存储器的支持,从一定意义上说可以使程序设计人员不必考虑物理内存的大小。
有了新的模式,当然要有大量的新增寄存器的支持,学习这些寄存器也是学习保护模式的关键.新增寄存器如下:注:不可见的寄存器用红色标明,在后面会有讲解.以上这些都是要在后面讲到的,并且还会讲一下扩展的保护模式和扩展的V86模式!三个重要的系统表GDT、LDT和IDT首先说明的是,这三个表是在内存中由操作系统或系统程序员所建,并不是固化在哪里,所以从理论上是可以被读写的。
这三个表都是描述符表.描述符表是由若干个描述符组成,每个描述符占用8个字节的内存空间,每个描述符表内最多可以有8129个描述符.描述符是描述一个段的大小,地址及各种状态的.描述符表有三种,分别为全局描述符表GDT、局部描述符表LDT和中断描述符表IDT。
什么叫实模式,什么叫保护模式
什么叫实模式,什么叫保护模式?概念……没背过特点……DOS就是实模式的,现在的Winows、Unix之类东西都是保护模式的。
实模式下只能访问那可怜的1M内存,要想突破这个限制,麻烦得很,你还记得DOS下那一堆什么XMS (扩充内存)、EMS(扩展内存)吧?本来是连续的64M内存,在DOS下访问,还得调用什么中断,好麻烦。
Watcom C++之所以当时有些名气就是占了这个便宜,说集成开发环境,那和BC是没法比,但就因为它提供了DOS4GW支持,可以很方便的是你的程序在DOS访问4G 内存,写32位的程序。
至于保护模式,特性挺多,如线性地址、虚拟内存、权限保护之类的东西都是CPU提供的功能,为开发现代操作系统提供了很多便利。
x86CPU在初始化的时候都是先进入实模式,然后操作系统再切换到保护模式。
详情你找本书看看吧。
有一本《386保护模式编程》你可以看看,写得挺多。
dos下内存是很简单的,指针指向的几乎就是实际的物理地址。
实模式的指针是16bit的,就是直接访问的内存是640k,640k~1M之间的内存是通过中断把页切换到640k里读写完之后又Move到640k以外的。
Dos4GW又提供了别的中断来访问1M~8M以外的内存。
你理解在操作系统限制的时候做这些突破是多么“技巧”的一个年代吧。
其实386已经支持32位指针了,这时又引入了GDT,LDT等概念。
怎么说呢....靠,这样吧,比如你有一大衣柜(GDT),有无数的小抽屉(LDT)。
这个抽屉是你的,那个是你MM的,你MM翻你的抽屉就会发现套套,你翻你MM的抽屉会发现情书...所以要保护!《386保护模式编程》书我看问题的追溯到8086/8088在80866/88时代,地址线只有20条,只能寻址到1M8086采用段式存储管理,每个段最多寻址64k ,原因:指针是16bit的到80286是地址线达到32条,可以寻址到4G的虚拟空间此时提出了保护模式可采用分页式存储管理,以寻址到4G的空间现在的操作系统都是基于80286的保护模式区别与8086提供的实地址方式简介(转)这篇文章将会着重介绍内存寻址的不同方法。
CPU 主频 X86的实模式,保护模式,虚拟8086模式Microsoft Office Word 97 - 2003 文档
CPU的主频,即CPU内核工作的时钟频率(CPU Clock Speed)。
通常所说的某某CPU是多少兆赫的,而这个多少兆赫就是“CPU的主频”。
很多人认为CPU的主频就是其运行速度,其实不然。
CPU的主频表示在CPU内数字脉冲信号震荡的速度,与CPU实际的运算能力并没有直接关系。
主频和实际的运算速度存在一定的关系,但目前还没有一个确定的公式能够定量两者的数值关系,因为CPU的运算速度还要看CPU的流水线的各方面的性能指标(缓存、指令集,CPU的位数等等)。
由于主频并不直接代表运算速度,所以在一定情况下,很可能会出现主频较高的CPU实际运算速度较低的现象。
比如AMD公司的AthlonXP系列CPU大多都能以较低的主频,达到英特尔公司的Pentium 4系列CPU较高主频的CPU性能,所以AthlonXP系列CPU才以PR值的方式来命名。
因此主频仅是CPU性能表现的一个方面,而不代表CPU的整体性能。
CPU的主频不代表CPU的速度,但提高主频对于提高CPU运算速度却是至关重要的。
举个例子来说,假设某个CPU在一个时钟周期内执行一条运算指令,那么当CPU运行在100MHz 主频时,将比它运行在50MHz主频时速度快一倍。
因为100MHz的时钟周期比50MHz的时钟周期占用时间减少了一半,也就是工作在100MHz主频的CPU执行一条运算指令所需时间仅为10ns比工作在50MHz主频时的20ns缩短了一半,自然运算速度也就快了一倍。
只不过电脑的整体运行速度不仅取决于CPU运算速度,还与其它各分系统的运行情况有关,只有在提高主频的同时,各分系统运行速度和各分系统之间的数据传输速度都能得到提高后,电脑整体的运行速度才能真正得到提高。
提高CPU工作主频主要受到生产工艺的限制。
由于CPU是在半导体硅片上制造的,在硅片上的元件之间需要导线进行联接,由于在高频状态下要求导线越细越短越好,这样才能减小导线分布电容等杂散干扰以保证CPU运算正确。
从实模式到保护模式中断技术的教学认识
长江 大学计算机科 学学 院 李
LI Pe ng
鹏
( Co l l e g e o f Co mp u t e r S c i e n c e ,YANGTZ E Un i v e r s i t y,J i n g z h o u Hu b e i 4 3 4 0 2 3 ,Ch i n a)
在 《 微 机 原 理 及 应 用 》 课 程 中 , 中 断 机 制 和 中 断 技 术 是 很 重 要 的 内容 ,它 是 微 机 系 统 的 主 要 组 成 部 分 之 一 。 随 着 计 算 机 技 术 的 不 断 发 展 ,尤 其 是 计 算 机 运 行 的速 度 越 来 越 高 ,对 计 算 机 的 性 能 要 求 也 随 之 愈 来 愈 高 , 不仅要求 外设 与C P U 并行操作 ,而且要求计算 机 能够随时通 过中断方 式发现错误 ,计算机 出现异常时 能够 及时 处理 故障等 。在实模式 下 和 保 护 模 式 下 分 别 转 到 中 断 服 务 程 序 入 口 地 址 的 方 式 区 别 很 大 , 工 作 在 保 护 模 式 下 的 微 型计算机 ,其中断 的功能越来越 强, 中断 系统越来越 复杂,组 成中断系统 的中断技术 成 为 了计 算机 系 统 中 十 分 重 要 的 技 术 ,它 是 《 微 机 原 理 及 应 用 》 课 程 教 学 中 的 重 点 ,也 是难 点 。 1 . 实 模 式 下 中 断 系统 的要 点 3 2 位机 在 实模 式 下 的 中断机 制与 8 0 8 6 的中断机制完 全兼容 。8 0 8 6 有一 个简单而灵 活 的 中断 系 统 ,每 个 中 断 都 有 一 个 中 断 类 型 码 , 以供 C P U 进行识别 ,8 0 8 6 最 多能处理2 5 6 种 不 同 的 中 断 类 型 。 中 断 可 以 由C P U 以 外 的 硬 件 设 备 驱 动 , 也 可 由 软 件 中 断指 令 启 动 。在 某 些 情 况 下 , 也 可 由C P U自身 启 动 。8 0 8 6 的 中 断源可分 为两类 ,即外部 中断和 内部 中断, 外部中 断分为可屏蔽 中断 I N T R 和 非 屏 蔽 中 断 N M I , 可屏 蔽 中 断 请 求 线 I N T R 通 常 由 中 断 控 制 器8 2 C 5 9 A 驱动 , N M I 的优 先 级 比 I N T R 高 。 内部 中 断 是 通 过 软 件 调 用 的 不 可 屏 蔽 中断 , 包 括 溢 出 、单 步 等 陷 阱 中 断 和 I R T T i 指 令 中断 等 8 0 8 6 的 中 断 系 统 以位 于 内存 0 段 内偏 移 地 址从0  ̄0 3 F F H 区域 的 中断 向 量 表 为 基 础 , 中 断 向量 表 中最 多 可 以存 放 2 5 6 个 中断 向量 , 中 断 向量 是 指 中断 服 务 程 序 的 首 地 址 ,包 括 1 6 位 的代 码 段 值 和 1 6 位 的偏 移 地 址 值 ,共 有 4 个 字 节 。 每 个 中 断类 型 码 对 应 一 个 中断 向 量 , C P U 通 过 中 断 类 型 码 找 到 对 应 的 一 个 中 断 向 量 ,于 是 ,执 行 相 应 的 中断 服 务程 序 。 2 . 保护模式下中断 系统的 中断过程 保 护 模 式 下 为 每 一 个 中断 和 异 常 都 分 配 了一个唯一 的识别码 ,称 为中断类 型码 ,微 处理器 用分配给 每个异常 或者 中断的类型码 作 为 访 问 中断 描 述 符 表 ( I 【 r r ) 的 索 引 , 以确 定 中断 或 异 常 处理 程 序 的首 地 址 所 在 的表 项 。 保 护 模 式下 ,仍 然 根 据 2 5 6 个 中 断类 型 码 ,从 中断描述 符表 I D T 和全 局描述 符表 G D T ( 或 局 部 描 述 符表 L D T ) 中经 两 级 查 找 后 ,形 成3 2 位 的 中 断 服 务 程 序 的 首 地 址 ,保 护 模 式 下 进入 中断服 务程 序 的过程 如 图1 所 示 , 以 中 断 类 型 码 乘 以8 作为访 问I D T 的偏 移 地 址 , 读取相应 的中断f q / 陷 阱 门描 述 符 ( 表项) , 门 描 述符给 出了1 6 位 的段 值 ( 选择符) 和 中断 服 务程序 的偏移 地址 ( 偏移 量) , 其 中3 2 位偏移
实模式与保护模式
摘自“/rosetta/article/details/8933200”64KB-4GB-64TB?我记得大学的汇编课程、组成原理课里老师讲过实模式和保护模式的区别,在很多书本上也有谈及,无奈本人理解和感悟能力实在太差,在很长一段时间里都没真正的明白它们的内含,更别说为什么实模式下最大寻址空间为1MB?段的最大长度不超过64KB?而保护模式下为啥最大寻址能力就变成了64TB?每个段最大也达4GB?更甚者分段和分页这两个高深的概念像我这种菜鸟怎么也理解不了啊!寻址能力都达64TB了,为啥我的电脑内存只有2GB呢?其实不用纠结于这事,这64TB就是所谓的虚拟地址空间,也叫逻辑地址空间,它能够寻址这么多,只是它有这个能力,并不代表你的内存就要装这么大,你内存比它小再多也不会影响你工作,反过来,要是它的寻址能力只有1MB,而你有2GB的内存,那么那1.9GB就没有实际用处了,这就太浪费资源了。
而实际上这个64TB也没有什么实际意义,因为32位的地址总线能寻址的线性地址空间和物理地址空间都是2^32=4GB。
这个64TB是怎么出来的,稍后揭晓。
实模式与保护模式的来历我们先来说一下为什么有实模式和保护模式的区别。
最早期的8086 CPU只有一种工作方式,那就是实模式,而且数据总线为16位,地址总线为20位,实模式下所有寄存器都是16位。
而从80286开始就有了保护模式,从80386开始CPU数据总线和地址总线均为32位,而且寄存器都是32位。
但80386以及现在的奔腾、酷睿等等CPU为了向前兼容都保留了实模式,现代操作系统在刚加电时首先运行在实模式下,然后再切换到保护模式下运行。
再来区别下几个基本概念:逻辑地址、线性地址和物理地址。
这些概念一时没领会没关系。
继续往下看。
三种地址逻辑地址:即逻辑上的地址,实模式下由“段基地址+段内偏移”组成;保护模式下由“段选择符+段内偏移”组成。
线性地址:逻辑地址经分段机制后就成线性地址,它是平坦的;如果不启用分页,那么此线性地址即物理地址。
“真实模式”和“保护模式”
江西 黄焕如
1992-11-06
由于8086的CPU寄存器为16位,“真实模式”只好采用逻辑定址方式(SEGMENT:OFFSET),可定址1MB,即只能使用前20条地址线。而286拥有24条地址线,386拥有高达32条地址线,但是DOS操作系统只能在CPU“真实模式”下工作,浪费了宝贵的硬件资源,因此,“保护模式”使得CPU发挥了更大的潜力。
80286以上的微机有上述两种工作模式,“真实模式”是为了与8086/8088相兼容而设置的,如果将80286以上的微机在“真实模式”下工作,几乎就是一个快速的8086而已。要真正地利用80286以上的微机的优越性,必须在“保护模式”下工作。
“保护模式”由硬件提供的四层特权(4-LEVEL PRIVILEGE,RING0至RING3),使得某些操作系统(如OS/2、UNIX)能避免系统本身的侵入,也能防止某个应用软件影响另一个软件的生存的可能性,因此可以说,“保护模式”的出现是为了多用户或者多任务的安全而考虑的重要一环。
事实上当使用较高版本的DOS时,运行了虚拟磁盘驱动程序,CPU已经悄悄地切换到了“保护模式”,否则根本不可能寻址到1MB以上的空间。
随着微型计算机硬件的迅速发展,应用软件一定会,也必须进入“保护模式”,才能开拓更大的格局,发挥硬件的高超性能。
Hale Waihona Puke
实模式和保护模式
什么是保护模式自从1969年推出第一个微处理器以来,Intel处理器就在不断地更新换代,从8086、8088、80286,到80386、80486、奔腾、奔腾Ⅱ、奔腾4等,其体系结构也在不断变化。
80386以后,提供了一些新的功能,弥补了8086的一些缺陷。
这其中包括内存保护、多任务及使用640KB以上的内存等,并仍然保持和8086家族的兼容性。
也就是说80386仍然具备了8086和80286的所有功能,但是在功能上有了很大的增强。
早期的处理器是工作在实模式之下的,80286以后引入了保护模式,而在80386以后保护模式又进行了很大的改进。
在80386中,保护模式为程序员提供了更好的保护,提供了更多的内存。
事实上,保护模式的目的不是为了保护程序,而是要保护程序以外的所有程序(包括操作系统)。
简言之,保护模式是处理器的一种最自然的模式。
在这种模式下,处理器的所有指令及体系结构的所有特色都是可用的,并且能够达到最高的性能。
保护模式和实模式从表面上看,保护模式和实模式并没有太大的区别,二者都使用了内存段、中断和设备驱动来处理硬件,但二者有很多不同之处。
我们知道,在实模式中内存被划分成段,每个段的大小为64KB,而这样的段地址可以用16位来表示。
内存段的处理是通过和段寄存器相关联的内部机制来处理的,这些段寄存器(CS、DS、SS和ES)的内容形成了物理地址的一部分。
具体来说,最终的物理地址是由16位的段地址和16位的段内偏移地址组成的。
用公式表示为:物理地址=左移4位的段地址+偏移地址。
在保护模式下,段是通过一系列被称之为"描述符表"的表所定义的。
段寄存器存储的是指向这些表的指针。
用于定义内存段的表有两种:全局描述符表(GDT)和局部描述符表(LDT)。
GDT是一个段描述符数组,其中包含所有应用程序都可以使用的基本描述符。
在实模式中,段长是固定的(为64KB),而在保护模式中,段长是可变的,其最大可达4GB。
保护模式汇编入门
保护模式汇编入门1.引言1.1 概述概述保护模式汇编是一种计算机编程语言,用于在计算机系统的保护模式下编写程序。
保护模式是一种操作系统提供的模式,它能够提供更高的系统资源访问权限和更强大的功能,相比实模式和其他模式,保护模式具有更大的内存地址空间和更多的指令集。
随着计算机技术的发展,保护模式汇编已经成为了程序员必备的工具之一。
它不仅可以用于编写高效的操作系统内核,还可以用于编写底层设备驱动程序和系统工具。
在保护模式汇编中,可以直接访问内存和硬件设备,并且能够利用专门的指令和特性来提高程序的性能和效率。
保护模式汇编的学习曲线较为陡峭,需要对计算机系统的底层原理有一定的了解。
首先,需要熟悉汇编语言的语法和特性,包括寄存器、指令、标志位等的使用。
其次,需要了解保护模式的特点和限制,比如段机制、特权级和中断处理等。
最后,需要学习如何通过汇编语言来编写具体的程序,包括如何访问内存、处理中断和异常等。
在本文中,我们将介绍保护模式汇编的基本概念和特点。
首先,我们将详细解释什么是保护模式汇编,以及它与其他模式的区别。
然后,我们将介绍保护模式汇编的特点,包括扩展的内存地址空间、多任务处理和特权级机制。
最后,我们将总结保护模式汇编的重要性,并展望它的未来发展。
通过本文的学习,读者将能够了解保护模式汇编的基本知识,并能够开始编写简单的保护模式汇编程序。
1.2 文章结构文章结构部分的内容可以包括以下内容:在本文中,我们将按照以下结构来进行讲解和介绍保护模式汇编的相关知识:1. 引言:首先,我们将通过一个概述来引入本文的主题,简要介绍保护模式汇编的基本概念和其在计算机系统中的重要性。
接着,我们会说明本文的结构和目的,为读者提供一个整体的导读。
2. 正文:在正文部分,我们将详细介绍保护模式汇编的基本概念和特点。
首先,我们会解释什么是保护模式汇编,并对其与实模式汇编的区别进行对比。
然后,我们将深入探讨保护模式汇编的特点,如分段机制、特权级和中断处理等方面的内容。
实模式与保护模式
实模式与保护模式1. 实模式,⼜叫实地址模式,CPU完全按照8086的实际寻址⽅法访问从00000h--FFFFFh(1MB⼤⼩)的地址范围的内存,在这种模式下,CPU只能做单任务运⾏;寻址公式为:物理地址=左移4位的段地址+偏移地址,即:物理地址是由16位的段地址和16位的段内偏移地址组成的。
2.保护模式,⼜叫内存保护模式,寻址采⽤32位段和偏移量,最⼤寻址空间4GB,在这种模式下,系统运⾏于多任务,设计这种模式的原因和好处是:保护模式增加了寻址空间,增加了对多任务的⽀持,增加了段页式寻址机制的内存管理(分段机制使得段具有访问权限和特权级,各应⽤程序和操作系统的代码和核⼼是被保护的,这也是多任务⽀持的实现关键和保护这个名字的由来)。
寻址过程为:物理地址=由段地址查询全局描述符表中给出的段基址+偏移地址,即:物理地址由影像寄存器中的基址加上16位或者32位的偏移组成。
==============================================1:实模式是CPU启动的时候的模式这时候就相当于⼀个速度超快的8086不能使⽤多线程不能实现权限分级还不能访问20位以上地址线,也就是说只能访问1M内存()2:保护模式操作系统接管CPU后.会使CPU进⼊保护模式.这时候可以发挥80x86的所有威⼒..包括权限分级.内存分页.等等等等各种功能============================================1.虚拟8086模式是运⾏在保护模式中的实模式,为了在32位保护模式下执⾏纯16位程序。
它不是⼀个真正的CPU模式,还属于保护模式。
2.保护模式同实模式的根本区别是进程内存受保护与否。
可寻址空间的区别只是这⼀原因的果。
实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和⽤户程序没有区别对待,⽽且每⼀个指针都是指向"实在"的物理地址。
CPU的实模式和保护模式简介
16位微处理器8086寄存器组成8086/8088包括:4个16位的数据寄存器,2个16位的指针寄存器,2个16位变址寄存器,分成四组。
通用寄存器中,这些寄存器除完成规定的专门用途外,均可用于传送和暂存数据,可以保存算术逻辑运算的操作和运算结果。
段寄存器能在8086 中实现1M物理空间寻址,并可与8080 CPU进行兼容。
段寄存器都是16位的,分别称为代码段(Code Segment)寄存器CS、数据段(Data Segment)寄存器DS、堆栈段(Stack Segment)寄存器SS,附加段寄存器。
标志寄存器在8086中有一个16位用于反映处理器的状态和运算结果的某些特征。
(其中只有9位有定义)这些标志位分为两类:其一是运算结果标志,主要用于反映处理器的状态和运算结果特征。
(例如:进位标志、零标志、符号标志、溢出标志等)其二是状态控制标志,它控制着处理器的操作。
要通过专门的指令才能使状态控制标志发生变化。
(例如:方向标志、中断允许标志、追踪标志)内存的寻址(实模式)8086 CPU有20根地址线,可直接寻址的物理地址空间为1M。
尽管8086/8088内部的ALU 每次最多进行16位运算,但存放存储单元地址偏移的指针寄存器都是16位的,所以8080/8086通过内存分段和使用段寄存器的方法来有效地实现寻址1M的空间。
存储单元的逻辑地址由段值和偏移两部分组成,用如下形式表示:段值:偏移所以根据逻辑地址可以方便地得到存储单元的物理地址,计算公式如下:物理地址(20位) = 段值*16+偏移段值通过段寄存器的值来取得,偏移可由指令指针的IP或其他可作为内存指针使用的寄存器给出。
偏移还可以直接用16位数给出。
指令中不使用物理地址,而使用逻辑地址,由总线接口单元BIU按需要根据段值和偏移自动形成20位物理地址。
32位微处理器1985年,真正的32位微处理器80386DX诞生,为32位软件的开发提供了广阔的舞台。
保护模式
1:实模式:寻址采用和8086相同的16位段和偏移量最大寻址空间1MB..最大分段64KB可以使用32位指令32位的x86 CPU用做高速的80862:保护模式:寻址采用32位段和偏移量最大寻址空间4GB,最大分段4GB (Pentium Pre及以后为64GB)在保护模式下CPU可以进入虚拟8086方式这是在保护模式下的实模式程序运行环境。
一.保护方式简介80386有三种工作方式:实模式,保护模式和虚拟8086模式。
本文介绍保护方式下的80386及相关的程序设计内容。
实模式下的80386寄存器,寻址方式和指令等基本概念,除特别说明外在保护方式下仍然保持。
尽管实方式下80386的功能要大大超过其先前的处理器(8086/8088,80186,80286),但只有在保护方式下,80386才能真正发挥更大的作用。
在保护方式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间;扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持;支持多任务,能够快速地进行任务切换和保护任务环境;4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离;支持虚拟8086方式,便于执行8086程序。
<一>存储管理机制为了对存储器中的程序及数据实现保护和共享提供硬件支持,为了对实现虚拟存储器提供硬件支持,在保护方式下,80386不仅采用扩充的存储器分段管理机制,而且提供可选的存储器分页管理机制。
这些存储管理机制由80386存储管理部件MMU实现。
1.目标80386有32根地址线,在保护方式下,它们都能发挥作用,所以可寻址的物理地址空间高达4G字节。
在以80386及其以上处理器为CPU的PC兼容机系统中,把地址在1M以下的内存称为常规内存,把地址在1M 以上的内存称为扩展内存。
80386还要对实现虚拟存储器提供支持。
实模式和保护模式的区别
实模式和保护模式的区别实模式和保护模式的区别2009-08-31 20:19 551人阅读评论(1) 收藏举报从80386开始,cpu有三种工作方式:实模式,保护模式和虚拟8086模式。
只有在刚刚启动的时候是real-mode,等到linux操作系统运行起来以后就运行在保护模式(所以存在一个启动时的模式转换问题)。
实模式只能访问地址在1M以下的内存称为常规内存,我们把地址在1M 以上的内存称为扩展内存。
在保护模式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间;扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持;支持多任务,能够快速地进行任务切换和保护任务环境;4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离;支持虚拟8086方式,便于执行8086程序。
1.虚拟8086模式是运行在保护模式中的实模式,为了在32位保护模式下执行纯16位程序。
它不是一个真正的CPU模式,还属于保护模式。
2.保护模式同实模式的根本区别是进程内存受保护与否。
可寻址空间的区别只是这一原因的果。
实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向"实在"的物理地址。
这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。
为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。
这样,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。
至此,进程(这时我们可以称程序为进程了)有了严格的边界,任何其他进程根本没有办法访问不属于自己的物理内存区域,甚至在自己的虚拟地址范围内也不是可以任意访问的,因为有一些虚拟区域已经被放进一些公共系统运行库。
实模式与保护模式
实模式、保护模式2009-06-07 17:18参考了百度百科中关于实模式的讨论:/view/404433.htm及/toening/blog/item/d8d927d403bdfdc350da4b6d.html和/trueailei/blog/item/b8faa413a22c57d7f7039e4d.html实模式、保护模式、虚拟模式都是X86中的概念。
从寻址方式来说,CPU中的IP(EIP)中存放虚地址,把虚地址转换到物理地址,各个模式有各自的转换方式。
实模式下,虚地址到实地址转换:DS段寄存器左移4位与偏移地址相加,得到物理地址,寻址1M。
保护模式下,虚地址到实地址转换经过MMU(内存管理单元),也就是分段与分页机制,寻址4G。
保护有两层含义:1、任务间保护:多任务操作系统中,一个任务不能破坏另一个任务的代码,这是通过内存分页以及不同任务的内存页映射到不同物理内存上来实现的。
2、任务内保护:系统代码与应用程序代码虽处于同一地址空间,但系统代码具有高优先级,应用程序代码处于低优先级,规定只能高优先级代码访问低优先级代码,这样杜绝用户代码破坏系统代码。
这是通过段式管理来实现,4G虚拟内存中,代码数据和堆栈各占有一个段,段是一个独立有意义的内存单元,有基地址和边界以及本段的优先级,windows系统有两个优先级,Ring0(高优先级)或Ring3(低优先级),系统代码段和数据段属于Ring0,不能被用户代码(Ring3)访问。
实模式:16bit的8086处理器标志着IntelX86王朝的开始,并且引入了一个重要概念——段。
8086处理器地址总线扩展到 20位,但算术逻辑运算单元(ALU)宽度即数据总线却只有16位,也就是直接运算的指针长度是16位的。
为支持1M寻址空间,引入分段的方法。
为支持分段8086CPU设置四个16bit段寄存器:CS、DS、SS、ES,对应于地址总线中的高16位。
寻址时,段寄存器*0x10+偏移地址=物理地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
什么是实模式、保护模式和虚拟8086方式1:实模式:寻址采用和8086相同的16位段和偏移量,最大寻址空间1MB,最大分段64KB。
可以使用32位指令。
32位的x86 CPU用做高速的8086。
2:保护模式:寻址采用32位段和偏移量,最大寻址空间4GB,最大分段4GB (Pentium Pre及以后为64GB)。
在保护模式下CPU可以进入虚拟8086方式,这是在保护模式下的实模式程序运行环境。
第一:实模式下程序的运行回顾.程序运行的实质是什么?其实很简单,就是指令的执行,显然CPU是指令得以执行的硬件保障,那么CPU如何知道指令在什么地方呢?对了,80x86系列是使用CS寄存器配合IP寄存器来通知CPU指令在内存中的位置.程序指令在执行过程中一般还需要有各种数据,80x86系列有DS、ES、FS、GS、SS等用于指示不同用途的数据段在内存中的位置。
程序可能需要调用系统的服务子程序,80x86系列使用中断机制来实现系统服务。
总的来说,这些就是实模式下一个程序运行所需的主要内容(其它如跳转、返回、端口操作等相对来说比较次要。
)第二:保护模式---从程序运行说起无论实模式还是保护模式,根本的问题还是程序如何在其中运行。
因此我们在学习保护模式时应该时刻围绕这个问题来思考。
和实模式下一样,保护模式下程序运行的实质仍是“CPU执行指令,操作相关数据”,因此实模式下的各种代码段、数据段、堆栈段、中断服务程序仍然存在,且功能、作用不变。
那么保护模式下最大的变化是什么呢?答案可能因人而异,我的答案是“地址转换方式”变化最大。
第三:地址转换方式比较先看一下实模式下的地址转换方式,假设我们在ES中存入0x1000,DI中存入0xFFFF,那么ES:DI=0x1000*0x10+0xFFFF=0x1FFFF,这就是众所周知的“左移4位加偏移”。
那么如果在保护模式下呢?假设上面的数据不变ES=0x1000,DI=0xFFFF,现在ES:DI等于什么呢?公式如下:(注:0x1000=1000000000000b= 10 0000 0000 0 00)ES:DI=全局描述符表中第0x200项描述符给出的段基址+0xFFFF现在比较一下,好象是不一样。
再仔细看看,又好象没什么区别!为什么说没什么区别,因为我的想法是,既然ES中的内容都不是真正的段地址,凭什么实模式下称ES为“段寄存器”,而到了保护模式就说是“选择子”?其实它们都是一种映射,只是映射规则不同而已:在实模式下这个“地址转换方式”是“左移4位”;在保护模式下是“查全局/局部描述表”。
前者是系统定义的映射方式,后者是用户自定义的转换方式。
而它影响的都是“shadow register”从函数的观点来看,前者是表达式函数,后者是列举式函数:实模式:F(es-->segment)={segment |segment=es*0x10}保护模式:F(es-->segment)={segment |(es,segment)∈GDT/LDT}其中GDT、LDT分别表示全局描述符表和局部描述符表。
第四:保护模式基本组成保护模式最基本的组成部分是围绕着“地址转换方式”的变化增设了相应的机构。
1、数据段前面说过,实模式下的各种代码段、数据段、堆栈段、中断服务程序仍然存在,我将它们统称为“数据段”,本文从此向下凡提到数据段都是使用这个定义。
2、描述符保护模式下引入描述符来描述各种数据段,所有的描述符均为8个字节(0-7),由第5个字节说明描述符的类型,类型不同,描述符的结构也有所不同。
若干个描述符集中在一起组成描述符表,而描述符表本身也是一种数据段,也使用描述符进行描述。
从现在起,“地址转换”由描述符表来完成,从这个意义上说,描述符表是一张地址转换函数表。
3、选择子选择子是一个2字节的数,共16位,最低2位表示RPL,第3位表示查表是利用GDT(全局描述符表)还是LDT(局部描述符表)进行,最高13位给出了所需的描述符在描述符表中的地址。
(注:13位正好足够寻址8K项)有了以上三个概念之后可以进一步工作了,现在程序的运行与实模式下完全一样!!!各段寄存器仍然给出一个“段值”,只是这个“假段值”到真正的段地址的转换不再是“左移4位”,而是利用描述符表来完成。
但现在出现一个新的问题是:系统如何知道GDT/LDT在内存中的位置呢?为了解决这个问题,显然需要引入新的寄存器用于指示GDT/LDT在内存中的位置。
在80x86系列中引入了两个新寄存器GDR和LDR,其中GDR用于表示GDT在内存中的段地址和段限(就是表的大小),因此GDR是一个48位的寄存器,其中32位表示段地址,16位表示段限(最大64K,每个描述符8字节,故最多有64K/8=8K个描述符)。
LDR用于表示LDT在内存中的位置,但是因为LDT本身也是一种数据段,它必须有一个描述符,且该描述符必须放在GDT中,因此LDR使用了与DS、ES、CS等相同的机制,其中只存放一个“选择子”,通过查GDT表获得LDT的真正内存地址。
对了,还有中断要考虑,在80x86系列中为中断服务提供中断/陷阱描述符,这些描述符构成中断描述符表(IDT),并引入一个48位的全地址寄存器存放IDT的内存地址。
理论上IDT表同样可以有8K项,可是因为80x86只支持256个中断,因此IDT实际上最大只能有256项(2K大小)。
第五:新要求---任务篇前面介绍了保护模式的基本问题,也是核心问题,解决了上面的问题,程序就可以在保护模式下运行了。
但众所周知80286以后在保护模式下实现了对多任务的硬件支持。
我的第一反应是:为什么不在实模式下支持多任务,是不能还是不愿?思考之后,我的答案是:实模式下能实现多任务(也许我错了:))。
因为多任务的关键是有了描述符,可以给出关于数据段的额外描述,如权限等,进而在这些附加信息的基础上进行相应的控制,而实模式下缺乏描述符,但假设我们规定各段的前2个字节或若干字节用于描述段的附加属性,我觉得和使用描述符这样的机制没有本质区别,如果再附加其他机制...基于上述考虑,我更倾向于认为任务是独立于保护模式之外的功能。
下面我们来分析一下任务。
任务的实质是什么呢?很简单,就是程序嘛!!所谓任务的切换其实就是程序的切换!!现在问题明朗了。
实模式下程序一个接一个运行,因此程序运行的“环境”不必保存;保护模式下可能一个程序在运行过程中被暂停,转而执行下一个程序,我们要做什么?很容易想到保存程序运行的环境就行了(想想游戏程序的保存进度功能),比如各寄存器的值等。
显然这些“环境”数据构成了一类新的数据段(即TSS)。
延用前面的思路,给这类数据段设置描述符(TSS描述符),将该类描述符放在GDT中(不能放在LDT中,因为80x86不允许:)),最后再加一个TR寄存器用于查表。
TR是一个起“选择子”作用的寄存器,16位。
好了,任务切换的基本工作就是将原任务的“环境”存入TSS数据段,更新TR寄存器,系统将自动查GDT表获得并装载新任务的“环境”,然后转到新任务执行。
第六:附加要求---分页篇为什么叫附加要求,因为现在任务还不能很好地工作。
前面说过,任务实质上是程序,不同的程序是由不同的用户写的,所有这些程序完全可能使用相同的地址空间,而任务的切换过程一般不会包括内存数据的刷新,不是不可能,而是如果那样做太浪费了。
因此必须引入分页机制才可能有效地完成对多任务的支持。
分页引入的主要目标就是解决不同任务相互之间发生地址冲突的问题。
分页的实质就是实现程序内地址到物理地址的映射,这也是一个“地址转换”机制,同样可以使用前面的方案(即类似GDT的做法):首先建立页表这样一种数据段,在80x86中使用二级页表方案,增设一个CR3寄存器用于存放一级页表(又称为页目录)在内存中的地址,CR3共32位,其低12位总是为零,高20位指示页目录的内存地址,因此页目录总是按页对齐的。
CR3作为任务“环境”的一部分在任务切换时被存入TSS数据段中。
当然还得有相应的缺页中断机制及其相关寄存器CR2(页故障线性地址寄存器)。
第七:总结保护模式下增加了什么?1、寄存器GDR LDR IDR TR CR32、数据段描述符表(GDT LDT) 任务数据段(TSS) 页表(页目录二级页表)3、机制权限检测(利用选择子/描述符/页表项的属性位)线性地址到物理地址的映射第八:保护模式常用名词解释前面内容中出现过的不再解释。
1、RPL 选择子当中的权限位确定的权限2、CPL 特指CS中的选择子当中的权限位确定的权限3、EPL EPL=Max(RPL,CPL),即RPL和CPL中数值较大的,或说权限等级较小的4、DPL 描述符中的权限位确定的权限5、PL 泛指以上4种特权级6、任务特权=CPL7、I/O特权由EFLAGS寄存器的位13、14确定的权限8、一致代码段一种特殊的代码段,它在CPL>=DPL时允许访问正常的代码段在CPL=DPL RPL<=DPL时才允许访问。