保护模式在实模式下初始化控制寄存器,如(GDTR,LDTR等)以及页表,然后通过设置CR0寄存器使其中的保护模式使能位置位,进入保护模式,该模式下80386支持优先级机制,不同的程序运行在不同的特权级上,共0~3四个级别,操作系统在最高的特权级0上

不同模式下寻址方式:

物理地址:内存中的真实地址

实模式下

逻辑地址:段地址和偏移地址

逻辑地址=物理地址,因为此时没有分段或分页机制(所谓的段地址是人为看作一个段的首地址,而不是系统的机制)

实模式下每一个指针都指向实际的物理地址,可以轻易修改其中的内容,不安全

保护模式下

线性地址:线性地址空间中的一个地址

线性地址空间是80386处理器通过段机制控制下形成的地址空间,在操作系统的管理下,每个运行的用程序有相对独立的一个或多个内存空间段,每个段有各自的起始地址和长度属性,这样使应用程序之间相互隔离,实现对地址空间的保护

逻辑地址(也称虚拟地址):16位段选择子 + 32位段内偏移

int boo = 1;
int *foo = &boo;

boo是一个整型变量,foo变量是一个指向boo地址的整型指针变量,foo中存储的内容就是boo的逻辑地址

系统采用段式管理机制来实现逻辑地址到线性地址的转换

未启动启页机制时,逻辑地址(通过段基址处理)生成线性地址=物理地址

在页机制开启后,逻辑地址(通过段机制处理)生成线性地址,随后生(通过页机制处理)成物理地址。

关于实模式和保护模式下的寻址:

因为8086CPU地址总线为20位而寄存器、数据总线只有16位,无法存储和传送20位的数据,才不得不采取段地址左移4位的方式。

32位机的数据总线、寄存器、地址总线都是32位,可直接给出一个32位数就能找到对应的地址,因此不再需要段地址左移的用法,但是为了向下兼容,保留了16位寻址模式,即实模式

保护模式下的寻址可以采取基址+偏移的方式,但不同的是,这里的基址无需进行左移处理,所有的32位的通用寄存器都可以作为基址寄存器(存储basepointer),除ESP之外的通用寄存器都可以作为变址寄存器(存储indexpointer),变址寄存器允许乘以1/2/4/8作为比例因子(indexscale),最后还允许加上一共8/32位的偏移量(immed32)

AT&T:immed32(basepointer, indexpointer, indexscale)   =imm32 + basepointer + indexpointer x indexscale
Intel:   [basepointer + indexpointer x indexscale + imm32]

要注意,尽管通用寄存器、标志寄存器都已经扩展到32位,但段寄存器依旧是16位的,可以理解为为了兼容8086PC机的段地址:偏移地址的寻址方式

在保护模式下使用段地址:偏移地址的寻址模式时(即使用分段机制),段寄存器中存放的不再是段基址了,而是存放了一个段选择子,又称段选择符,一个选择子对应一个长64-bit的描述符,其中有32bit是段基址,另32位存储着段的长度、属性等内容,由于内存中不止一个段,因此也需要多个段描述符,所以把段描述符集中存储在一块连续的存储空间里,排上序号,这就有了描述符表GDT,因此我们需要先找到描述符表的基地址,在32位CPU中,有一个48位的专用寄存器GDTR存储着全局描述符表的基地址等信息,而段寄存器中选择子的高13位存储着相应描述符的序号,段寄存器的功能就是选择描述符,所以也把段寄存器叫做段选择器,在得到了段的基地址,加上了偏移地址以后(段地址无需左移),我们便得到了“中间地址”–线性地址,接着通过页机制最终得到物理地址,当然,如果没有页机制,则线性地址就是物理地址了

参考博客:计算机地址与8086寻址方式以及32位处理器的寻址方式

​ 32位cpu寻址小结

​ 32位保护模式内存寻址原理

80386CPU加电后的第一条指令问题

80386CPU将BIOS ROM编址在32位内存地址空间的最高端,即4GB地址的最后一个64KB内

解释:如果和8086一样,把BIOS编址在1MB内存地址空间的最高64KB中,因为BIOS是只读的,则内存(这里指RAM)就会被一块ROM分隔成不连续的两端,很不协调

加电之后,CPU进入实模式,将CS的值设置为0xF000,CS的shadow register的Base值初始化为0xFFFF0000,EIP寄存器初始化为0x0000FFF0,所以第一条指令的物理地址为0xFFFFFFF0

解释:虽然说实模式下计算地址需要CS中的地址进行移位,但是Intel规定这种计算方式是在CS中的初始值被改变以后才使用,所以未改变之前是用Base+EIP的计算方式

解释上面的解释:上面提到的Base,是一个寄存器,而不是GDT中的base(这时候还没有GDT),现代的CPU为每个段寄存器增加了两个寄存器:Base和Limit,它们的值不能通过指令读写,而是由CPU自动设置的

补充:在实模式下,Base寄存器的值等于CS的值左移4位,在保护模式下,根据段选择子在GDT中找到对应段描述符,其中base部分的值会更新到对应段寄存器的Base寄存器中,然后进行基址+偏移地址的计算

总结:归根结底,80386地址的计算方式都是Base+IP/EIP,只不过Base寄存器中的值在不同情况下来源不同,可以是初始状态下的值,可以来自对CS值的移位,也可以来自GDT表

该地址上有一条长跳转指令,该长跳转指令会更新CS寄存器和它的shadow register,执行完后,表面CS没有变化,但其shadow register已经被更新,其Base值为0x000F0000,此时的物理地址为0x000FE05B。此时的地址在1M以内了,且位于RAM 中,Intel设计了一种映射机制,将高地址的BIOS ROM映射到1MB以内的RAM空间,使其具有只读属性,即1M空间里最高的64KB的内容和4GB里最高的64KB的内容相同

Intel 80386寄存器

通用寄存器:EAX/EBX/ECX/EDX/ESI/EDI/ESP/EBP,低16位就是8086的AX/BX/CX/DX/SI/DI/SP/BP

寄存器 含义
EAX 累加器
EBX 基址寄存器
ECX 计数器
EDX 数据寄存器
ESI 源地址指针寄存器
EDI 目的地址指针寄存器
EBP 基址指针寄存器
ESP 堆栈指针寄存器

段寄存器:除了8086的CS/DS/ES/SS,增加了FS/GS,都是16位的,用于不同属性内存段的寻址

注:CS在实模式和保护模式下有着不同的含义

寄存器 含义
CS 代码段(Code Segment)
DS 数据段(Data Segment)
ES 附加数据段(Extra Segment)
SS 堆栈段(Stack Segment)
FS 附加段
GS 附加段

指令指针寄存器:EIP的低16位就是8086的IP,存储下一条要执行指令的内存地址,在分段地址转换中,表示指令的段内偏移地址

标志寄存器:EFALGS,比8086的16位标志寄存器增加了4个控制位,共20个控制位

CF(Crray Flag):进位标志位
PF(Parity Flag):奇偶标志位
AF(Assistant Flag):辅助进位标志位
ZF(Zero Flag):零标志位
SF(Signal Flag):符号标志位
IF(Interrupt Flag):中断允许标志位,由CLI,STI控制
DF(Direction):向量标志位,由CLD,STD控制
OF(Overfolw Flag):溢出标志位
IOP(I/0 Privilege Level):I/O特权级字段,宽度2位,指定了I/O指令的特权级,如果当前特权级别在数值上小于或等于IOPL,则可执行,否则发生一个保护性故障中断
NT(Nested Task):控制中断返回指令IRET,宽度为1,若NT=0,则用堆栈中保存的值恢复EFALGS,CS,EIP。从而实现中断返回,若NT=1,则通过任务切换实现中断返回,在ucore中,设置NT为0

还有一些应用程序无法访问的控制寄存器,如CR0,CR2,CR3……

清华OS前置知识:80386处理器相关推荐

  1. 03-1 手敲八千字,认识垃圾收集器必须清楚的前置知识【垃圾收集器的内存分配策略】

    03-1 50问!了解垃圾收集器必须清楚的前置知识--垃圾收集器的内存分配策略 author:陈镇坤27 创建时间:2021年12月27日01:58:45 字数:7932 文章目录 03-1 50问! ...

  2. 学好一类技术,需要掌握哪些前置知识?

    你好,我是悦创. 写技术类文章已经有一段时间了,随着涉及的技术越来越深,很多同学觉得学习的难度也越来越大了,并私信我提出了一些问题.有些问题,是我之前学习也碰到过的或者我思考过的:也有些问题是我没想到 ...

  3. netty入门前置知识-NIO

    netty入门前置知识-NIO Netty简介 Netty 的介绍 Netty 的应用场景 互联网行业 游戏行业 大数据领域 其它开源项目使用到 Netty Netty 的学习资料参考 Java BI ...

  4. 从零写一个编译器(二):语法分析之前置知识

    项目的完整代码在 C2j-Compiler 前言 在之前完成了词法分析之后,得到了Token流,那么接下来就是实现语法分析器来输入Token流得到抽象语法树 (Abstract Syntax Tree ...

  5. 一篇文章指明做JavaWeb项目需要的前置知识+完整项目初解读(萌新必看,十分友好)

    前言 过了web这个阶段了,项目也完成了的我想给各位后来者总结一下我整个项目从开始到结束的经验,当然,也不是一帆风顺,报错有时候折磨的要死,废话不多说,现在就开始吧. 本文一共分为两个部分:纯理论科普 ...

  6. 区块连教程(一):前置知识-linux补充

    区块连教程(一):前置知识-linux补充 区块链教程(二):基础概念介绍 区块链教程(三):Solidity编程基础 区块链教程(四):搭建私链.web3.js基础 区块链教程(五):合约编写实战实 ...

  7. 20211003:数字滤波器前置知识,sinc函数与Sa函数

    sinc函数和Sa函数对比解析 原理分析 sinc函数,又称辛格函数.表达式为: sinc(t)=sin(πt)/(πt)sinc(t) = sin(πt)/(πt) sinc(t)=sin(πt)/ ...

  8. iOS小技能:app侧登录流程【上篇】 (前置知识)

    文章目录 引言 I 前置知识 1.1 分布式系统下的session 1.2 服务端侧的登录处理 1.3 app侧需求 II app侧登录流程 2.1 开发步骤 2.2 token信息存储注意事项 2. ...

  9. 学习社会工程学需要什么前置知识

    学习社会工程学不需要特定的前置知识,但是有一些相关的知识和技能可以帮助您更好地理解和掌握社会工程学,包括: 社会学知识:了解人类社会.群体行为和社会关系的基础知识,对理解社会工程学的基本原理和技巧有很 ...

  10. UE4 Unlua源码解析1 - 读源码的前置知识

    源码的前置知识 1 lua.h内的方法 lua和C交互的API 1.1 lua_register 1.2 lua_gettop 1.3 lua_pop 1.4 lua_tolstring 1.5 lu ...

最新文章

  1. boost::mp11::mp_cond相关用法的测试程序
  2. 网络摄象机常用传输协议
  3. dynamic 仪表板_仪表板完成百万美元交易
  4. 优酷上线4K修复版经典剧漫 高清修复计划5年焕新5000部经典
  5. 结局就在附近! (对于SQL Server 2008和SQL Server 2008 R2)
  6. ireport导出pdf后中文字符全部不显示(已解决)
  7. ubunut 安装 pyqt5
  8. .net DLL反编译文件
  9. sublime复制一行_sublime怎么快速复制一行,快捷键是什么?
  10. 知到答案 环境学概论 智慧树网课章节测试答案
  11. 微信公众平台iPhone版内测开始了
  12. 软件·质量·管理(2)任务排期
  13. 赛灵思 Xilinx UG1387 - Versal ACAP 硬件、IP 和平台开发方法指南(中文版) (v2020.2)
  14. 实验七 3 小希练打字
  15. 像素颜色和颜色向量相加相乘的理解
  16. c语言输出国旗图形,大家来看看国旗杂画
  17. 如何用数据分析进行游戏道具的精准投放?
  18. 1+X 云计算平台运维与开发认证(初级)样卷A——附答案
  19. ESP使用MQTT登陆阿里云,arduino环境
  20. COMSOL初学2——几何操作

热门文章

  1. 天猫精灵 python_天猫精灵控制家里的灯
  2. java 实现打印机_JAVA实现连接本地打印机并打印文件的实现代码
  3. 要做飞思卡尔智能车要学哪些知识?
  4. 【CGAL_网格处理】平滑处理
  5. 利用canvas的getImageData()方法制作《在线取色器》
  6. 使用C#的Winform实现图文识别OCR及截图功能
  7. 在VMware16虚拟机安装Ubuntu详细教程
  8. Ubuntu14.04/16.04安装Dukto
  9. c语言 公交卡一卡通系统,公共交通一卡通系统
  10. 盘点python socket 中recv函数的坑