保护模式及其编程
2-保护模式-2.3
微机接口技术
第二模块 保护模式
微机接口技术
任务
多任务环境,是指其硬件允许软件系统 中存在多个任务,并能够以分时的方式使各 程序轮流执行。 当运行一个应用程序后,操作系统就为 这个程序创建一个任务。
微机接口技术
任务寄存器(TR)
• 在保护模式下,在任何时刻都有一个当 前任务,当前任务由TR寄存器指定,CPU在 这个任务的环境下执行。因此,系统中至 少存在一个任务。 • TR为16位选择符,选中TSS描述符.
微机接口技术
Privilege – check
16-bit visible selector CS Target Segment Selector INDEX RPL Invisible Descriptor CPL
Privilege check by CPU
Data Segment Descriptor
微机接口技术
由任务寄存器TR取得TSS的过程
Physical Memory ③ TR 16 15 0 LIMIT ⑤ TSS TSS descriptor GDT ①② 47 BASE
④
①和②步由GDTR确定了GDT表在存储器中的位 臵和限长。TR是一个选择符,这个选择符中包含了 TSS描述符在GDT中的索引。③步依据TR在GDT中取
出TSS描述符。在第④和⑤步中,在TSS描述符中取
得TSS的基址和限长。
微机接口技术
任务执行环境
每个任务都由两个部分组成:任务执行 环境TES(Task Executation Space)和任务 状态段TSS(Task State Segment)。任务执 行环境包括一个代码段、堆栈段和数据段等, 任务在每一个特权级上执行时都有一个堆栈 段。 图2-26
86保护模式
在IA32下,CPU有两种工作模式:实模式和保护模式。
在实模式下,段寄存器含有段值,为访问存储器形成物理地址时,处理器引用相应的某个段寄存器并将其值乘以16,形成20位的段基地址。
计算公式如下:物理地址= 段值*16 + 偏移其中段值和偏移都是16位的,这样通过“段:偏移”的方式达到了1MB的寻址能力。
在保护模式下,寄存器是32位的,但是为了兼容性,地址仍然用“段:偏移”的方式来表示,只不过这时的保护模式下的“段”的概念已经发生了根本的改变,虽然段值仍然由原来的cs、ds等寄存器表示,但是此时它仅仅是一个索引,叫做选择子,指向一个数据结构(叫做GDT,Global Descriptor Table全局描述符表或者LDT,Local Descriptor Table局部描述符表)的一个表项(叫做Descriptor描述符)。
1.全局描述符表寄存器GDTR(/u/16292/showart_396896.html)GDTR长48位,其中高32位为基地址,低16位为界限。
由于GDT 不能有GDT本身之内的描述符进行描述定义,所以处理器采用GDTR为GDT这一特殊的系统段提供一个伪描述符。
GDTR给定了GDT,如下图所示。
GDTR中的段界限以字节为单位。
由于段选择子中只有13位作为描述符索引,而每个描述符长8个字节,所以用16位的界限足够。
2.局部描述符表寄存器LDTR局部描述符表寄存器LDTR规定当前任务使用的局部描述符表LDT。
LDTR类似于段寄存器,由程序员可见的16位的寄存器和程序员不可见的高速缓冲寄存器组成。
实际上,每个任务的局部描述符表LDT作为系统的一个特殊段,由一个描述符描述。
而用于描述符LDT 的描述符存放在GDT中。
在初始化或任务切换过程中,把描述符对应任务LDT的描述符的选择子装入LDTR,处理器根据装入LDTR可见部分的选择子,从GDT中取出对应的描述符,并把LDT的基地址、界限和属性等信息保存到LDTR的不可见的高速缓冲寄存器中。
80X86保护模式及其编程(一)
80X86保护模式及其编程(⼀)80x86系统寄存器和系统指令1、标志寄存器(EFLAGS)标志寄存器EFLAGS的标志位含义如下图:TF 位8是跟踪标志(Trace flag),当设置该位时可为调试操作启动单步执⾏⽅式。
复位时则禁⽌单步执⾏。
在单步执⾏⽅式下,处理器会在每个指令执⾏后产⽣⼀个调试异常,这样我们可以观察执⾏程序在每条指令执⾏后的状态。
IOPL 位13-12时I/O特权级(I/O Privilege Level)字段。
该字段指明当前运⾏程序或任务的I/O特权级别IOPL。
当前任务或程序的CPL必须⼩于这个IOPL才能访问I/O地址空间。
只有当CPL位特权级0时,程序才可以使⽤POPF或IRET指令修改这个字段,IOPL也是控制对IF标志修改的机制之⼀NT 位14是嵌套任务标志(Nested Task)。
它控制着被中断任务和调⽤任务之间的链接关系。
在使⽤CALL指令、中断或异常执⾏任务调⽤时,处理器会设置该标志,在通过IRET指令从⼀个任务返回时,处理器会检查并修改这个NT标志。
使⽤POPF/POPFD指令也可以修改这个标志,但是在应⽤程序中改变这个标志的状态会产⽣不可意料的异常RF 位16时恢复标志(Resume Flag)。
该标志⽤于控制处理器对断点指令的响应。
当设置时,这个标志会临时禁⽌断点指令产⽣调试异常;当标志复位时,则断点指令将会产⽣异常。
RF的主要功能是允许调试异常后重⾏执⾏⼀条指令。
当调试软件使⽤IRETD指令返回被中断程序之前,需要设置堆栈上EFLAGS内容中的RF标志,以防⽌指令断点造成另⼀个异常,处理器会在指令返回之后⾃动清除该标志,从⽽再次允许指令断点异常。
VM位17是虚拟-8086⽅式标志,当设置该标志时,新开启虚拟-8086⽅式,当复位该标志时,则回到保护模式内存管理寄存器处理器提供了4个内存管理寄存器(GDTR、LDTR、IDTR和TR),⽤于指定分段内存管理所使⽤的系统表的基地址,其中包含有分段机制的重要信息。
保护模式详解
保护模式详解在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。
进入保护模式完整代码(汇编)
进⼊保护模式完整代码(汇编)⼀开始使⽤C编写进⼊PM代码,因为内嵌汇编太多,不易查询汇编如何出错,所以改⽤纯汇编编写。
过程中学到⼀个⼩技巧,当赋值的数太⼤时,编译会报错,这时在数前加个0即可解决。
程序编译完成,基本过程已然了解,但是在测试机上跑的时候会⾃动重启。
;;;;;;;;;;;;;;;;;;;程序开始;;;;;;;;;;;;;;;;;;;data structjump macro selector, offsetdb 0eahdw offsetdw selectorendmdesp strucsegLimit dw 0; byte0, 1segBaseLow dw 0; byte2, 3segBaseMid db 0; byte4segAttribute dw 0; byte5, 6segBaseHigh db 0; byte7desp endspgdt strucsegLimit dw 0ffffh; byte 0, 1segBase dd 0; byte 2, 3, 4, 5pgdt ends;--------------------------------------------------------------------; real mode data segment begin;.data.386p; if not p, lgdt is not defineddseg segment use16; gdt segment begingdt label byteDUMMY desp <>; 空描述符dataSegDesp desp <0ffffh,0h,0h,092h,> ; data segment isstarted with: 0x00000000hdataSegSel = dataSegDesp - gdtcodeSegDesp desp <0ffffh,,,098h,>codeSegSel = codeSegDesp - gdtextSegDesp desp <0ffffh,,88h,092h,> ; ext segment is started with: 0x00880000hextSegSel = extSegDesp - gdtgdtLen = $ - gdtpgdtr pgdt <gdtLen-1, >; gdt segment end; pmode data segment beginbuffers db 256 dup('@')bufferLen = $ - offset buffersmsgLen = $ - offset msg; pmode data segment endbufferd db 256 dup('y')bufferd2 db 256 dup('x')dseg ends; real mode data segment end;--------------------------------------------------------------------cseg segment use16;.codeassume cs:cseg, ds:dsegstart:MOV ax, dsegMOV ds, ax;prepare to jump to pmode;1>. init gdtr;2>. init code descriptor;3>. init data descriptor;4>. enable a20 address;5>. set cr0;6>. jump pmode;1>. init gdtrMOV bx, 16MUL bxADD ax, offset gdtADC dx, 0MOV WORD PTR pgdtr.segBase, ax MOV WORD PTR pgdtr.segBase+2, dx ;2>. init code descriptorMOV ax, csMUL bxMOV codeSegDesp.segBaseLow, ax MOV codeSegDesp.segBaseMid, dl MOV codeSegDesp.segBaseHigh, dh ;3>. init data descriptorMOV ax, dsMUL bxADD ax, offset buffersadc dx, 0MOV dataSegDesp.segBaseLow, ax MOV dataSegDesp.segBaseMid, dl MOV dataSegDesp.segBaseHigh, dh lgdt pgdtr;4>. enable A20 addresscli;call enableA20PUSH axin al, 92hor al, 2out 92h, alPOP ax;5>. set cr0MOV eax, cr0or eax, 1MOV cr0, eax;6>. jump to pmode;JMP pmodejump <codeSegSel>,<offset pmode> pmode:MOV ax, dataSegSelMOV ds, axMOV ax, extSegSelMOV es, ax;;;;;;;访问SPI空间的内容;;;;;;;;;mov ebx,[0fed1f800h]mov ds:[0000],ebxmov dx,0mov ah,9int 21h ;;;;;;;;;;;;;;;;MOV eax, cr0and eax, 0fffffffehMOV cr0, eaxJMP rmodermode:call disableA20stiMOV ax, dsegMOV ds, axdisableA20 procPUSH axin al, 92hand al, 0fdhout 92h, alPOP axRETdisableA20 endpMOV ah, 4ch int 21h cseg ends END start。
保护模式汇编实例
保护模式汇编实例
保护模式(Protected Mode)是x86架构的一种工作模式,在这种模式下,操作系统可以更好地保护硬件资源,防止软件对硬件的非法访问。
下面是一个简单的x86汇编语言程序,演示如何在保护模式下进行简单的内存操作。
```assembly
section .data
msg db 'Hello, World!', 0
section .text
global _start
_start:
; 进入保护模式
mov eax, cr0
or eax, 0x1
mov cr0, eax
; 跳转到保护模式代码段
mov ebx, 0x1000 ; 段地址
mov ecx, 0x10 ; 偏移量
call ebx
_exit:
; 退出保护模式
mov eax, cr0
and eax, 0xfffffffe
mov cr0, eax
; 退出程序
mov eax, 1 ; 系统调用号(sys_exit)
xor ebx, ebx ; 返回值
int 0x80 ; 中断0x80
```
在上面的程序中,首先将cr0寄存器的值设置为1,表示进入保护模式。
然后,通过调用0x10段的代码来执行保护模式下的代码。
在这个例子中,只是简单地显示一条“Hello, World!”的消息。
最后,将cr0寄存器的值设置为0,表示退出保护模式,并使用系统调用号1来退出程序。
保护模式汇编入门
保护模式汇编入门1.引言1.1 概述概述保护模式汇编是一种计算机编程语言,用于在计算机系统的保护模式下编写程序。
保护模式是一种操作系统提供的模式,它能够提供更高的系统资源访问权限和更强大的功能,相比实模式和其他模式,保护模式具有更大的内存地址空间和更多的指令集。
随着计算机技术的发展,保护模式汇编已经成为了程序员必备的工具之一。
它不仅可以用于编写高效的操作系统内核,还可以用于编写底层设备驱动程序和系统工具。
在保护模式汇编中,可以直接访问内存和硬件设备,并且能够利用专门的指令和特性来提高程序的性能和效率。
保护模式汇编的学习曲线较为陡峭,需要对计算机系统的底层原理有一定的了解。
首先,需要熟悉汇编语言的语法和特性,包括寄存器、指令、标志位等的使用。
其次,需要了解保护模式的特点和限制,比如段机制、特权级和中断处理等。
最后,需要学习如何通过汇编语言来编写具体的程序,包括如何访问内存、处理中断和异常等。
在本文中,我们将介绍保护模式汇编的基本概念和特点。
首先,我们将详细解释什么是保护模式汇编,以及它与其他模式的区别。
然后,我们将介绍保护模式汇编的特点,包括扩展的内存地址空间、多任务处理和特权级机制。
最后,我们将总结保护模式汇编的重要性,并展望它的未来发展。
通过本文的学习,读者将能够了解保护模式汇编的基本知识,并能够开始编写简单的保护模式汇编程序。
1.2 文章结构文章结构部分的内容可以包括以下内容:在本文中,我们将按照以下结构来进行讲解和介绍保护模式汇编的相关知识:1. 引言:首先,我们将通过一个概述来引入本文的主题,简要介绍保护模式汇编的基本概念和其在计算机系统中的重要性。
接着,我们会说明本文的结构和目的,为读者提供一个整体的导读。
2. 正文:在正文部分,我们将详细介绍保护模式汇编的基本概念和特点。
首先,我们会解释什么是保护模式汇编,并对其与实模式汇编的区别进行对比。
然后,我们将深入探讨保护模式汇编的特点,如分段机制、特权级和中断处理等方面的内容。
汇编语言与接口技术课件 h4-1 保护方式编程
3)保护方式编程 以下通过由实方式进入保护方式,显示一行字符的例子,说明保护方式编程 具体实现。 例4.9 定义全局描述符表和任务的局部描述符表 GDTSEG SEGMENT ;定义全局描述符表 GDT LABLE BYTE GDTNUL DESCRIPTOR ;空描述符 REALDA DESCRIPTOR 0FFFFH,0,0,92,0 ;数据段描述符, 92H表示可读写 REALDA _SEL = REALDA-GDT CODE1 DESCRIPTOR 0FFFFH,CODE1SEG,,98, ;代码段1描述符, 98H表示只执行 CODE1_SEL = CODE1-GDT LDTAB DESCRIPTOR LDTLEN-1,LDTSEG,,82,;局部描述符表 段描述符,82H表示局部描述符表段类型值 LDT_SEL = LDTAB-GDT ;→LDTR GDTLEN = $ ; GDT的长度 GDTSEG ENDS
2)如果在保护方式中存储器分页被允许,在返回到实地址方式时要完成如 下工作: 将控制寄存器CR0中的PG位清零(禁止分页)。重新装载控制寄存器 CR3,清除转换后备缓冲器TLB。 3)考虑到系统的完整性,在发生任务变化时,必须阻止任何可能发生的 中断。可以使用CLI指令禁止INTR中断。 4)将控制寄存器CR0中的PE位复位,返回到实地址方式。 5)利用跳转指令JMP,转移到要运行的实地址方式代码。这条指令清除 指令队列。 6)进入实地址方式后,用LIDT指令来装载中断描述符表寄存器IDTR,建 立中断向量表。 7)开中断,根据需要,通过实地址方式代码装入段寄存器的值。
4.1.1
利用保护方式机构及使用保护方式专用指令进入保护方
式 1.保护方式专用指令
该类指令分为两类:保护方式控制指令和保护参数检验指令。保护方式控 制指令只能使用在系统软件中,而不能使用在应用程序中。 (1)保护方式控制指令 1)LGDT/LIDT SRC ;将源操作数SRC指定的48位存储器操作数 装入GDTR或IDTR 源操作数的低两字节存放描述符表寄存器的界限值,高4个字节存放线性 基地址( P10图1.10)。该指令对标志位无影响。 举例:LGDT [DI] ;将源操作数SRC指定的16位寄存器 或存储器操作数作为选择符装入LDTR 其中选择符为指向全局描述符表GDT中的类型为LDT的描述符(P10图1.11)。 该指令对标志位无影响。 举例:LLDT BX 2)LLDT SRC
探寻CPU保护模式
探寻cpu保护模式保护模式是自80386以来x86系列处理器一直沿用的工作模式。
保护模式,概括的介绍为保护多任务之间代码访问的完全隔离,规范单任务的用户代码和系统代码的访问格式,限制程序访问数据的自由性,使计算更加安全的进行。
本文将介绍保护方式的体系结构,以及保护模式工作原理,并与实模式的工作方式进行对比,介绍存储管理,地址转换以及多任务之间的联系及隔离的原理以及其实现的保护方式,深入了解处理器保护模式。
一、存储管理与地址转换保护方式下的存储管理与地址转换相对于实模式而言,虚拟实现较大的地址访问空间,对实现虚拟存储器提供硬件支持。
那么保护模式下,处理器是通过什么样具体的内存管理模式实现该种优点?在实模式下,内存地址的访问是通过(段基地址:偏移量)的方式来进行的,偏移量是相对于此段基地址而言。
基地址+偏移量得到一个内存绝对地址。
由此,我们可以看出,一个段具备两个因素:段基地址+段的最大长度,而对一个内存地址的访问,则是通过确定访问的段以及相对于这个段的偏移量,从而得到实际访问的内存地址。
在保护模式下,内存的管理模式分为两种,段模式和页模式,事实上保护模式的内存管理模式是:纯段模式和段页式。
用段模式的方式来说明保护模式下内存管理的方式。
因此在段管理模式下仍然采用的是(段基地址:偏移量)的方式。
运行在32位系统的保护模式,那么影响段值的两个因素即基地址以及偏移地址也都是32位的。
IA-32允许将一个段的基地址设为32位所能表示的任何值,而不再是实时模式下,一个段的基地址只能是16的倍数,而一个段的限定大小只能为固定值64 KB。
另外,保护模式下要为段模式提供了保护机制,也就说一个段的描述符需要规定对自身的访问权限。
所以,在保护模式下,对一个段的描述则包括3方面因素:基地址,限定段大小,权限,它们加在一起被放在一个64位长的数据结构中,被称为段描述符(GDT)。
这种情况下,段地址转换如图(1)如果我们直接通过一个64位段描述符来引用一个段的时候,就必须使用一个64位长的段寄存器装入这个段描述符。
保护模式
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还要对实现虚拟存储器提供支持。
保护模式下编程
保护模式下编程帐户luowei505050的专栏类别汇编;1.;===========================================================;在保护模式下32位CPU仍然可以用20位地址来实现32位地址线寻址;16位CPU: 16位段寄存器+16位偏移地址 (经地址加法器) -> 20位物理内存地址;32位CPU: 32位地址的内存段信息存入在一张内存表中,只需将表的索引存入16寄存器当中即可;保存表中索引的段寄存器称为:段选择子;表中每个表示32位内存段信息称为:段描述符(保存了段的地址和段的长度)。
;整张表称为:段描述符表;段选择子16位,其中高13位用来表示描述符表中的索引,其低3位用表示段描述符中所指向的段描述符的属性;;启动程序在屏幕中央打印一行字符串[BITS 16]org 07c00h ;指明程序开始地址是07c00h,而不是原来的00000;int汇编指令int 10hjmp maingdt_table_start: ;告诉编译器段描述符开始;Intel规定描述符表的第一个描述符必须是空描述符gdt_null:dd 0hdd 0h ;Intel规定段描述符表的第一个表项必须为0 gdt_data_addr equ $-gdt_table_start ;数据段的开始位置gdt_data:;数据段描述符dw 07ffh ;段界限dw 0h ;段基地址18位db 10010010b ;段描述符的第六个字节属性(数据段)db 1100000b ;段描述符的第七个字节属性db 0 ;段描述符的最后一个字节也就是段基地址gdt_video_addrequ $-gdt_table_startgdt_video: ;用来描述显存地址空间的段描述符dw 0FFH ;显存段界限就是1Mdw 8000Hdb 0BHdb 10010010bdb 11000000bdb 0gdt_code_addr equ $-gdt_table_start ;代码段的开始位置gdt_code:dw 07ff ;段界限dw 1h ;段基地址0~18位db 80h ;段基地址19~23位db 10011010b ;段描述符的第六个字节(代码段)db 11000000b ;段描述符的第七个字节db 0 ;段基地址的第二部分gdt_table_end:;通过lgdt指令可以把GDTR描述表的大小和起始地址存入gdtr寄存器中gdtr_addr:dw gdt_table_end-gdt_table_start-1 ;段描述表长度ddgdt_table_start ;段描述表基地址;lgdt [gdtr_addr] ;让CPU读取gdtr_addr所指向内存内容保存到gdtr寄存器当中;A20地址线,切换到保护模式时,A20地址线必须开启。
什么是实模式、保护模式和虚拟8086方式
什么是实模式、保护模式和虚拟8086方式1:实模式:寻址采用和8086相同的16位段和偏移量,最大寻址空间1MB,最大分段64KB。
可以使用32位指令。
32位的x86 CPU用做高速的8086。
2:保护模式:寻址采用32位段和偏移量,最大寻址空间4GB,最大分段4GB (Pentium Pro及以后为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现在比较一下,好象是不一样。
保护模式及其编程
04
DOS操作系统运行于实模式下
CPU被复位(加电)时,自动进入实模式。
1.实模式
保护模式
实模式下对一系列的寄存器进行设置,就可以进入保护模式。 CPU提供了段式和页式内存管理功能 CPU支持多任务和特权级 Windows/Linux操作系统运行于保护模式下
01
02
3.虚拟8086模式
2 虚拟内存管理
01
如果程序要访问的内容不在内存中,CPU会产生一个异常,由操作系统的存储器管理程序来处理,将所需的内容装入内存中。这就是所谓的虚拟存储器,它并不完全是真正的内存空间,也称做虚拟内存。
02
虚拟地址:程序指令中使用的地址,由段和偏移两个部分组成
线性地址:段的基地址再加上偏移量
02
4.执行单元
分段和分页单元负责地址产生、地址转换
和对总线接口单元的段检查。 CPU存储器管理的分段单元用硬件进行高速地址计算,完成逻辑地址到线性地址的转换和保护性检查; 分页单元实现保护模式下的分页机制,它可以将线性地址转换成物理地址,并由总线单元输出。
5.分段和分页单元
01
02
浮点运算单元集成在80486及以上的CPU中;
第10章 保护模式及其编程
单击此处添加副标题
2
支持存储器分段管理机制和分页管理机制
3
支持多任务
1
寻址高达4GB的物理地址空间
5
区分不同级别的代码
4
支持4个特权级和配套的特权检查机制
在保护模式下:
10.1 保护模式基础
10.1.1 32位CPU内部结构 CPU有8个处理单元:执行单元、分段单元、分页单元、总线单元、指令预取单元、指令译码单元、高速缓存单元和浮点运算单元。
第10章 保护模式程序设计
局部描述符表LDT:用来描述系统中运行的任务,每 个任务拥有一个独立的LDT。多任务系统中可以有多个LDT, 当任务切换时系统当前的LDT也随之切换。
2012-12-10
12
3.选择符 如何用一个断寄存器获得一个段地址? 在保护模式中段寄存器不再用来保存段基地址的高 16位,而是作为访问系统描述符表的变址寄存器来使用的。 根据段寄存器的内容可以从GDT或者LDT中唯一地选中一 个描述符进而得到对应的内存段的有关信息如段基地址。 此时段寄存器的内容被称为选择符(Selector)。选择符 长16位,其格式如图10.2所示。
2012-12-10
8
段属性:(Attributes)用来控制对内存段的 访问,所以又叫段访问权限。段属性描述了内存段 在系统中所起的作用,规定了内存段的主要特性。 段属性自始至终全面控制着内存段的访问,系统要 根据段属性对段的访问操作进行合法性检查。如果 访问操作不符合段属性的要求将引发系统异常,这 就为内存段的访问提供了有效的保护手段。有关段 属性位的定义和作用见10.2。
2012-12-10 11
中断描述符表IDT:存放中断处理程序对应的描述符 的入口,每个中断处理程序对应一个IDT描述符。在保护模 式下响应中断或者处理异常时,把中断向量号作为IDT中描 述符的索引,根据中断向量号从IDT中选择一个描述相应的 中断处理程序的段描述符进而转入中断处理。和GDT一样, 整个系统中只有一个IDT。因为系统最多可以识别256个中 断,所以IDT中最多有256个描述符,即IDT最大长度为2KB。
2012-12-10 6
7
0000 0000
0000 0000 段基地址 (B23B16)
6 7
段基地址 (B31-B24) 属性 (A7-A0)
保护模式编程
保护模式编程第1章保护模式编程一如果想更深、更亲近的了解电脑软件。
那么学习cpu是你的必选!! 386是CPU史的一大转折点,那386做基础课是最好不过了。
那么我们将开始进行学习之旅大家跟我一块学习吧,呵呵1.1 准备工作l1、NASM 编译环境(当然Masm 也可以但是用它来写COM程序比较麻烦)l2、虚拟机Virtual PC(Windows平台,执行比较快,即模拟又虚拟硬件)、WMWarve(WIndows平台虚拟硬件,)、Bochs(支持Windows平台、也支持在Linux平台上运行有RPM 版本的)我们这些生长在Windows这棵大树下的朋友们,还是用Virtual PC 吧.。
l3、写虚拟启动镜像文件的程序:不知道我观察的对不对?用Nasm 编译一个bin 然后将它转换为img 镜像文件的时候。
只要文件大小符合软驱的标准就能启动。
那么就代表a.bin 与a.img 文件的内容一模样就是文件大小不一样!我是不太了解镜像文件格式.我用的是Virtual PC。
1.2 开始接触引导程序1.2.1 Com文件Com文件是纯二进制的文件,也是直接与Cpu交换的顺序指令文件。
Com文件的大小是有限制的,不能超过64KB.因为8086时代的CPU地址线是20位的,20位能表达的数值也就是fffffh(1MB )。
而寄存器最高也只是16位,无法用5个F的形式来表达地址,所以用CS(段基地址)*16:IP(偏移地址)来寻址!80386后通用寄存器都得到了32位扩展! 而Cpu地址线也得到了32位的扩展。
引导程序前期是需要进入实模式的,因为这是硬件上的限制是IA32的限制。
386cpu只有两种模式: 实模式与保护模式,,1.2.2 引导程序引导程序也是有限制的,这个限制是靠Bios处理的,开机后Bios经过自检后,会从软驱或者硬盘的0面0磁道1扇区搜寻一个程序文件。
该文件的数据必需是等于512Byte,并且以aa55h结尾的(高高低低)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 选择子的TI位为0表示它所访问的描述符在GDT中, 为1表示描述符保在护模L式D及T其中编程。
保护模式及其编程
两级页表结构
• 页映射表的第一级称为页目录表,存储在一个4K字节的物 理页中。页目录表共有1K个表项,其中,每个表项为4字 节长,包含对应第二级表所在物理地址空间页的基地址。 页映射表的第二级称为页表,每张页表也安排在一个4K字 节的页中。每张页表都有1K个表项,每个表项为4字节长, 包含对应物理地址空间页的基地址。
虚拟地址 选择子 偏移地址
从 GDT 或 LDT 中得到的段描 述符
段基址 段界限
段属性
保护模式及其编程
+
线性地址
例:MOV EAX, DS : [EDX] 设描述符表的基地址存放在GDTR中,则转换结果为:
[(GDTR+DS×8)].Base + EDX 注:[A]表示取A所指向的内存单元的内容
描述符表
• 描述符可用于描述多种对象:存储段、任务状态 段、调用门、任务门、中断门、陷阱门和LDT。
• 为了便于组织管理,80386把描述符组织成线性表。 由描述符组成的线性表称为描述符表。
• 每个描述符表本身形成一个特殊的内存数据段。 这样的特殊数据段最多包含8192个描述符。该段 由操作系统维护、并由处理器中的存储管理单元 硬件(MMU)访问。
GDT和LDT
保护模式及其编程
GDTR、LDTR
• GDT和IDT的基地址分别存放在GDTR和IDTR中,而各个LDT 的基地址存放在GDT的LDT描述符中。LDTR是当前所使用的 LDT描述符的选择子。
• GDTR和IDTR长48位,高32位为基地址,低16位为界限。 • LDTR类似于段寄存器,存储的是当前所使用的LDT表的LDT
• 保护模式中的逻辑地址(虚拟地址)由16位的选 择子和32位的偏移量两部分组成。选择子放在段 地址寄存器中,用来指定一个段描述符
保护模式及其编程
14.1.1分段管理
• 分段机制实现了虚拟地址到线性地址的转换 • 程序员在编写程序时,会定义数据段、代码段等
多个逻辑段,分段管理机制就是用于管理这些段, 并将二维的虚拟地址转化成一维的线性地址。
选择子的格式:(一般放在段寄存器中) 索引值(13位)
描述符的格式:
TI(1) RPL(2)
7
Base(31 …24
6
5
Attribute
4
3
2
Base(23…0)
1
0
Limit(15…0)
7654321076543210
G D 0 AV L
Limit(19…16) P
保护模式及其编程
DPL DT
TYPE A
• 段由 段描述符 来定义,其中存放了关于段的三
个参数:(1)段基址 (Base, 32位) (2)段界 限(Limit, 20位) (3)段的属性(读/写/执行, 特权级等)(12位) • 段描述符存放在描述符表中,选择子就是用来指 定某个特定描述符的关于描述符表的索引
保护模式及其编程
段选择子与存储段描述符
• 由于页目录表和页表均由1K个表项组成,所以使用10位的 索引就能指定具体表项,即用10位的索引值乘以4加基地 址就得到了某个表项的物理地址。
• 任务切换时,页目录表和页表也要相应进行切换,使得不 同任务的线性地址空间被映射到不同的物理地址空间中。
描述符的选择子。 • 任务状态段寄存器TR包含指示描述当前任务的任务状态段
的描述符选择子,从而规定了当前任务的状态段。
保护模式及其编程
虚拟-线性地址转换过程
• 基本过程:通过虚拟地址中的选择子在描述符表 中找到相应的段描述符,取出其中的32位段基地 址,该基地址加上虚拟地址中偏移量就形成了线 性地址。当然,在相加之前要根据描述符中的 Limit字段判断一下该偏移量是否越界。
和I/O访问操作都进行严格检查,能够屏蔽普通程 序对系统、硬件和中断等资源的直接访问。 • 不同的特权级下有不同的指令系统 • 设置CR0的PE位为1可使系统进入保护模式
保护模式及其编程
14.1保护模式下的的存贮管理
15 0 31 0
选择子 偏移量
虚拟地址
分段 机制线性地址ຫໍສະໝຸດ 分页 机制物理地址
• 设置CR0的PG位可以开启(1)和关闭(1) 分页机制
保护模式及其编程
14.1.2 分页管理
• 分页机制在分段机制之后进行操作,以完成线性地址到物 理地址的转换过程。
• 保护模式下,CR0中的PG位控制分页管理机制是否生效。 • 分页机制把线性地址空间和物理地址空间分别划分为大小
相同的块。这样的块称之为页。通过在线性地址空间的页 与物理地址空间的页之间建立的映射,分页机制实现线性 地址到物理地址的转换。 • 在80386中,页的大小固定为4K字节,每一页的边界地址 必须是4K的倍数。因此,4G大小的地址空间被划分为1M个 页,每个页的起始地址用20位记录。 • 线性地址的低12位经过分页机制直接作为物理地址的低12 位使用。页映射函数可看成是把线性地址的高20位转换为 对应物理地址高20位的转换函数。
• 在80386中有三种类型的描述符表:全局描述符表 GDT、局部描述符表LDT 和 中断描述符表IDT。在
整个系统中,全局描述符表GDT和中断描述符表 IDT只有一张,局部描述符表可以有若干张,每个 任务有一张。保护模式及其编程
GDT和LDT
• GDT含有每一个任务都可能访问的描述符,通常包 含操作系统所使用的代码段、数据段和堆栈段的 描述符,也包含多种特殊描述符,如LDT描述符。 在任务切换时,并不切换GDT。通过GDT可以使各 任务都需要的段能够被共享。
第十四章 保护模式及其编程
保护虚拟地址模式(简称保护模式)
• 32位的寄存器可用、可寻址4GB的物理地址空间 • 逻辑-物理地址转换过程包含两级:先分段再分
页。(注:分页过程是可选的) • 为实现虚拟存储器提供了硬件支持 • 支持多任务,能够快速地进行任务切换和保护任
务环境 • 4个特权级和完善的特权检查机制,对所有的内存