微处理器管理模式(上)

1.微处理器的基本结构

总线接口单元(BIU)、中央处理单元(CPU)、存储器管理单元(MMU)

2.CPU的工作模式

 2.1 实模式
  • 不支持硬件上的多任务切换;不能对内存进行分页管理;不支持特权级。
  • 实模式下,就相当于一个16位的8086微处理器。
  • 采用类似8086的体系结构,寻址机制、中断处理机制都相同。20根地址线,使用1MB地址空间,以及16位的“段首址:偏移”的地址格式。
  • DOS操作系统运行于实模式下,Windows、Linux操作系统运行于保护模式下。
 2.2 保护模式
  • 保护模式下,CPU支持内存分页机制,提供段式、页式内存管理功能,协助操作系统高效实现虚拟内存,支持多任务和特权级。
  • 工作在保护模式时,物理寻址空间高达4GB(80386/80486)或64GB(Pentium及以上CPU)。
  • 保护模式下有四个特权级:分别为特权级0、特权级1、特权级2、特权级3。操作系统运行在特权级0,应用程序运行在特权级3。应用程序不能直接修改操作系统的程序与数据。
 2.3 虚拟8086模式(V86模式)
  • 32位的80x86给每个以V86模式运行的任务创造了一个与8086处理器十分相似的运行环境,以便运行DOS程序。
  • 既有保护功能,又能执行8086代码的工作模式。

3.寄存器

  寄存器大概可分为:程序可见寄存器(运行在保护模式或实模式下)、程序不可见/特殊寄存器(运行在保护模式下)。

 3.1 程序可见寄存器

  程序可见寄存器包括多个8位、16位、32位的寄存器。包括:通用寄存器,段寄存器,专用寄存器。汇编语言讨论寄存器时,要明确寄存器的位数,这是不能又歧义的。
在这里插入图片描述

  3.1.1通用寄存器

  通用寄存器可以被程序访问,用于传递和暂存数据,也可以参与算数逻辑运算,并保存运算结果。
16位cpu通用寄存器共有8个: AX, BX, CX, DX, BP, SP, SI, DI.
32位cpu通用寄存器共有8个: EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI

  • 数据寄存器 EAX, EBX, ECX, EDX (Data Register)
  • 指针寄存器 EBP, ESP (Pointer Register)
    注意:实模式使用SP(实模式是16位),保护模式使用ESP。实模式使用BP,保护模式使用EBP。
  • 变址寄存器 ESI, EDI (Index Register)

在这里插入图片描述

  3.1.2 段寄存器
  • 简介:实模式下的存储器采用分段管理方法组织,因此一个物理地址用段基址和偏移量表示。一个程序可以由多个段组成。
  • 段寄存器功能:段寄存器存放段基址。在实模式下存放段基地址的高16位,在保护模式下存放段选择符。
  1. 代码段寄存器CS(Code Segment):指定当前代码段,代码段中存放当前正在运行的程序段。在实模式下,段寄存器存放当前运行程序的段基址的高16位,在保护模式下,段寄存器存放当前正在运行程序的段选择符。
  2. 堆栈段寄存器SS(Stack Segment):指定当前堆栈段。
    说明:堆栈段是在内存开辟的一块特殊区域,其中的数据访问原则是后进先出(LIFO),允许插入和删除的一端叫做栈顶。IBM PC机中SP(或ESP)指向栈顶,SS指向堆栈段基地址。
  3. 数据段寄存器DS(Data Segment):指定当前运行程序所使用的数据段。
  4. 附加数据段寄存器ES(Extra Segment):指定当前运行程序所使用的附加数据段。
  5. 段寄存器FS和GS:指定当前运行程序的另外两个存放数据的存储段(只对80386以上机器有效)。
    说明:虽然DS、ES、FS、GS(甚至于CS、SS)所指定的段中都可以存放数据,但DS是主要的数据段寄存器,在默认情况下使用DS所指向段的数据。若要引用其它段中的数据,通常需要显式说明。
  3.1.3 专用寄存器

主要包括指令指针寄存器和标志寄存器。
(1)指令指针寄存器(IP/EIP/RIP)
  指令指针指向程序的下一条指令。这个寄存器作为16位寄存器时,使用IP。32位时,使用EIP。64位时,使用RIP。

(2)堆栈指针寄存器(SP/ESP/RSP)
  堆栈指针,指向栈顶单元。SP归类为8个通用寄存器之一,因为它可以像其他通用寄存器一样使用。但实际上,SP指向堆栈顶部,应用程序不应该随意修改,所以其性质又具有专用性,也可以认为它是专用寄存器。

(3)标志寄存器(FLAGS/EFLAGS/RFLAGS)
  标志寄存器:被称为状态寄存器,由运算结果特征标志和控制标志组成。
在这里插入图片描述

运算结果特征标志:用于记录程序中运行结果的特征。8086~Pentium的标志寄存器均含有CF、PF、AF、ZF、SF、OF这6位标志。

  • CF:进位标志,记录运算结果的最高位向前产生的进位或借位。CF=1,有进位或借位。CF=0,无。
  • PF:奇偶标志,记录运算结果最低8位中含1的个数。可用于检测数据传送过程中是否发生错误。 PF=1 个数为偶数,PF=0 个数为奇数。
  • AF:辅助进位标志,记录运算结果最低4位向前产生的进位或借位。只有在执行十进制运算指令时才关心此位。AF=1 有进位或借位 ,AF=0无进位或借位
  • ZF:零标志,记录运算结果是否为0。ZF=1 运算结果为零,ZF=0 结果非零。
  • SF:符号标志,记录运算结果的符号。SF=1 运算结果为负,SF=0 结果非负
  • OF:溢出标志,记录运算结果是否超出了机器所能表示的范围。可用于检测带符号数运算时是否发生溢出。OF=1 运算结果超出范围 ,OF=0
    结果未超出

控制标志位:控制标志控制处理器的操作,要通过专门的指令才能使控制标志发生变化。

  • IF:中断允许标志。IF的控制只对外部可屏蔽中断请求(INTR)起作用。IF=1/0 允许/禁止 CPU响应INTR。
  • DF:方向标志。专服务于字符串操作指令,指示串操作时操作数地址的增减方向。DF=1/0 串操作时操作数地址为自动减/增量。
  • TF:陷阱标志。用于程序调试。TF=1/0 CPU处于单步/连续方式。
 3.2 保护模式下的寄存器
  3.2.1GDTR(全局描述符表寄存器)

在这里插入图片描述

  • 其最低16位是限长,给出全局描述符表(GDT)的字节大小(其值比GDT的长度少1)。
  • 其高32位是基址(线性地址),指出GDT在物理存储器中存放的基地址。
  • LGDT指令可以将描述符表的起始位置装入GDTR。GDT(全局描述符表)
  • 全局存储器是一种共享系统资源,该存储器可以被所有任务访问。
  • 全局描述符表GDT是用来定义全局存储器空间的一种机制,它用段描述符说明一个全局存储器中的段,每个GDT最多含有8192个描述符(8192×8=64KB)。
  • GDT是位于存贮器中,用全局描述符表寄存器GDTR指出它的位置和大小,可软件编程改变。
  • 全局描述符表只能有一个。
  3.2.2 IDTR(中断描述符表寄存器)

在这里插入图片描述

  • 中断描述符表寄存器48位。
  • 其最低16位是限长,给出中断描述符表IDT的字节大小(其值比IDT的长度少1)
  • 其高32位是基址(线性地址),指出IDT在物理存储器中存放的基地址。
  • IDT中保存的是中断门描述符。每个门描述符包含8字节,IDT最多包含256个门描述符,因为CPU最多支持256个中断。中断门指出的是中断服务程序的入口。

GDTR和IDTR的值必须在进入保护模式之前装入。

  3.2.3 LDTR(局部描述符表寄存器)
  • 局部描述符表寄存器,16位寄存器! LDTR是一个16位的选择符,包含LDT描述符在GDT中的索引,不直接指出LDT的位置和大小。
  • 保护模式下多任务的环境中每个任务都有一个局部描述符表LDT。
  • LDT只含有与系统中某一个任务相关的各个段的描述符。
  • 和所有任务有关的公用段的描述符放在全局描述符表GDT中。
  • 每一任务的代码段、数据段、堆栈段与系统其他部分隔离开,达到保护的目的。
  3.2.4 段选择符

  段寄存器在实模式、V86模式、保护模式下有不同的内容。实模式和V86模式下,她们的用法兼容16位CPU,即段寄存器保存20位段基址的高16位,段基址的低4位为0。在保护模式下,段寄存器存放一个索引,称为段选择符。由段选择符从GDT或LDT中找到8个字节长的段描述符,从而确定关于这个段的全部描述信息。
在这里插入图片描述

  • RPL(Requestor Privilege Level):请求特权级,2位二进制数字,范围为0~3。00代表特权级0,01代表特权级1,10代表特权级2,11代表特权级3。请求特权级是将要访问的段的特权级。
  • TI(Table Indicator):表指示符。为0时,从GDT中选择描述符;为1时,从LDT中选择描述符。
  • Index:索引。指出要访问描述符在段描述符表中的顺序号,Index占13位。因此,顺序号的范围是0~8191。每个段描述符表(GDT或LDT)中最多有8192=213个描述符。
  3.2.5 任务寄存器

  任务寄存器(TR)在保护模式的任务切换机制中使用。在多任务环境下,每个任务都有属于自己的状态段。
  TR是16位的选择符,它指出了TSS描述符在GDT中的顺序号。TR的初值由软件装入,当执行任务切换指令时,TR内容自动修改。
  TSS中包含所启动任务所必须的信息,任务状态段TSS在存储器的基址和限长由TSS描述符指出。

  3.2.6 控制寄存器

  80386中有四个系统控制寄存器:CR0~CR3。如图2-6所示
在这里插入图片描述

  • CR0是,CR0中包含了6个预定义标志,这里就不再一一列出讲解。
  • CR1是未定义的控制寄存器,供将来的处理器使用。
  • CR2是页故障线性地址寄存器,保存最后一次出现页故障的全32位线性地址。用于发生页异常时报告出错信息。
  • CR3是页目录基址寄存器,高20位用来保存页目录表的起始物理地址的高20位,页目录表总是放在以4K字节为单位的存储器边界上,因此,它的地址的低12位总为0,不起作用,即使写上内容,也不会被理会。

4.内存管理

 4.1 实模式下分段管理

  实模式下,当存储器采用分段管理后,一个内存单元地址要用段基址和偏移量两个逻辑地址来描述。表示为”段基址:偏移量“。
  对于实模式寻址,要求其段基址必定位在地址为16的整数倍上。1MB空间的20位地址的第4位可以不表示处,而高16位就可以完全放入段寄存器。物理地址计算方法:10H*段基址+偏移量。(说白了,就是在16进制段基址后加一个0,然后在与偏移量相加)

 4.2 保护模式下分段管理

以CS:EIP为例:

  • CS中存放了一个16位的段选择符
  • EIP是32位偏移量
  • 16位段选择符加上32位偏移量,总共是48位,其中段选择符的2位RPL与虚拟地址的转换无关,因此可以认为虚拟地址是46位的,段选择符的Index和TI占14位,偏移量为32位,
  • 虚拟地址空间为246B=64TB

段基址=段的起始地址,段基址+限长(Limit)=段结束地址。
在这里插入图片描述
段描述符
在这里插入图片描述
段属性位P、S、A等,这里不再讲解,有需要可以自行百度。

 4.3 页式内存管理

  保护模式下的CPU支持分页基机制,并且分页管理是在分段管理机制的基础上工作的。它将分段管理机制得到的线性地址转换为物理地址
  分页机制的好处在于它可以把每个活动任务当前所必须的少量页面放在内存中,而不必将整个段调入内存,从而提高了内存的使用效率。

  • 所有页的长度固定为4KB,页与页之间也没有重叠。CPU将4GB的线性地址空间划分成220页。
  • 在Windows/Linux操作系统中,将段式内存管理和页式内存管理结合起来,主要是依赖页式内存管理来调度内存。
  • 线性地址到物理地址的映射
     —线性地址按页(4KB)为单位映射到物理地址。
     —每一个线性页面都映射到一个物理页面上。

在这里插入图片描述

  • 32位线性地址被划分为3个部分:
    在这里插入图片描述
    其中第1项是对页目录(Page Directory)的索引,第2项是对页表(Page Tables)的索引,第3项是线性地址在页面内的偏移。
  4.3.1 页表项

  页表项就是在分页转换时用到的页表描述符页描述符,都是32位,页表项格式如图2-24。
在这里插入图片描述

  • 页目录、页表和物理页的基地址的低12位全部为0,定位在页的边界上。
  • 页表项的低12位提供保护功能和统计信息。U/S位、R/W位、P位实现页保护机制。A、D、AVL访问控制。

在这里插入图片描述

  • 页表项的高20位基址,给出了物理页面的基地址的高20位。
  • 物理页面的基地址再加上线性地址中的12位字节的页内偏移量,得到物理地址。

5.总结

  了解微处理器管理模式是进行内核编程的前提。文章总结了微处理器的一些管理模式,包括CPU工作模式、寄存器、内存管理等。后面还会介绍任务和保护等相关的知识,敬请关注:微处理器管理模式(下)。
     在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值