32位机内存管理机制(上)

2023-11-05

一直有看linux内核的冲动,内核有些部分是汇编编写的,无奈汇编不大懂,所以利用五一三天假期大概走了一边8086CPU架构的汇编,8086CPU还是16位的,我们现在都进入64位时代了,这两者之间有很大的区别,但是看看16位的CPU汇编还是很重要的,这有助于理解32位的80386CPU。这篇文章来分析下80386的内存管理的一些基础知识,包括实模式、保护模式和内存寻址等等。

1.实模式

处理器被复位或者加电的时候以实模式启动。这时候处理器中各寄存器以实模式的初始化值工作。

80386处理器在实模式下的存储器寻址方式和8086是一样的,由段寄存器的内容乘以 16当做基地址,加上段内的偏移地址形成最终的物理地址,这时候它的32位地址线只使用了低20位。

 在实模式下,80386处理器不能对内存进行分页管理,所以指令寻址的地址就是内存中实际的物理地址。在实模式下,所有的段都是可以读、写和执行的。

实模式下80386不支持优先级,所有的指令相当于工作在特权级(优先级0),所以它可以执行所有特权指令,包括读写控制寄存器CR0等。

实际上,80386就是通过在实模式下初始化控制寄存器,GDTR,LDTR,IDTR与TR等管理寄存器以及页表,然后再通过加载CR0使其中的保护模式使能位置位而进入保护模式的。

当然,实模式下不支持硬件上的多任务切换。实模式下的中断处理方式和8086处理器相同,也用中断向量表来定位中断服务程序地址。中断向量表的结构也和8086处理器一样:每4个字节组成一个中断向量,其中包括两个字节的段地址和两个字节的偏移地址。

从编程的角度看,除了可以访问80386新增的一些寄存器外,实模式的80386处理器和8086有什么进步呢?其实最大的好处是可以使用80386的32 位寄存器,用32位的寄存器进行编程可以使计算程序更加简捷,加快了执行速度。

比如在8086时代用16位寄存器来完成32位的乘法和除法时,要进行的步骤实在是太多了,现在用32位寄存器一条指令就可以完成。80386中增加的两个辅助段寄存器FS和GS在实模式下也可以使用,这样,同时可以访问的段达到了6个而不必考虑重新装入的问题。

最后,很多80386的新增指令也使一些原来不很方便的操作得以简化。

2.保护模式

当 80386工作在保护模式下的时候,它的所有功能都是可用的。这时80386所有的32根地址线都可供寻址,物理寻址空间高达4GB。在保护模式下,支持内存分页机制,提供了对虚拟内存的良好支持。虽然与8086可寻址的1 MB物理地址空间相比,80386可寻址的物理地址空间可谓很大,但实际的微机系统不可能安装如此大的物理内存。所以,为了运行大型程序和真正实现多任务,虚拟内存是一种必需的技术。

保护模式下80386支持多任务,可以依靠硬件仅在一条指令中实现任务切换。任务环境的保护工作是由处理器自动完成的。在保护模式下,80386处理器还支持优先级机制,不同的程序可以运行在不同的优先级上。优先级一共分0~3 共 4个级别,操作系统运行在最高的优先级0上,应用程序则运行在比较低的级别上。配合良好的检查机制后,既可以在任务间实现数据的安全共享也可以很好地隔离各个任务。

从实模式切换到保护模式是通过修改控制寄存器CR0的控制位PE(位0)来实现的。

在这之前还需要建立保护模式必需的一些数据表,如全局描述符表GDT和中断描述符表IDT等。

DOS操作系统运行于实模式下,而Windows操作系统运行于保护模式下。

3.80386内存寻址机制

Windows的内存管理和DOS的内存管理有很大的不同,在了解Windows的内存管理模式之前,需要对80386保护模式下内存分页机制有所了解。

为了做个对比,先来看实模式下的内存寻址方式:在实模式下,一个完整的地址由段地址和偏移地址两部分组成。

处理器换算时先将段地址乘以10h,得到段在物理内存中的起始地址,然后加上16位的偏移地址得到实际的物理地址。

现在我们谈回到80386处理器的工作模式:


当80386处理器工作在保护模式和虚拟8086模式的时候,可以使用全部32根地址线访问4 GB大的内存。段地址加偏移地址的计算方法显然无法覆盖这么大的范围。

但计算一下就可以发现,实际上和8086同样的限制已经不复存在,因为80386所有的通用寄存器都是32位的,2^32 =4G,所以用任何一个通用寄存器来间接寻址,不必分段就已经可以访问到所有的内存地址。

这是不是说,在保护模式下,段寄存器不在有用了呢?

答案是否定的!实际上段寄存器更有用了,虽然在寻址上不在有分段的限制问题,但在保护模式下,一个地址空间是否

可以被写入,可以被多少优先级的代码写入等涉及保护的问题就出来了

要解决这些问题,必须对地址空间定义一些安全属性。段寄存器这是就派上了用场,不妨将这些属性放在段寄存器中!

但是问题来了,涉及属性和保护模式下段的其他参数,要表示的信息太多了,要用64长的数据才能表示,我们把这64位的属性数据叫做段描述符。

80386的段寄存器仍然是16位的,无法放下保护模式下的64位的段描述符,如何解决这个新的问题呢?解决办法是把所有段的段描述符顺序放在内存中的指定位置,组成一个段描述符表,而段寄存器中的16位用来做索引信息,指定这个段的属性用段描述符表中的第几个描述符来表示,这时,段寄存器中的信息就不再是段地址了,而是段选择器,可以通过它在段描述符表中”选择“一个项目以得到段的全部信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

32位机内存管理机制(上) 的相关文章

  • linux fseek函数用法详解

    1 功 能 重定位流 数据流 文件 上的 文件内部位置 指针 注意 不是 定位文件指针 文件指针指向文件 流 位置 指针指向文件内部的字节位置 随着文件的读取会移动 文件指针如果不重新赋值将不会改变指向别的文件 2 用 法 int fsee
  • 【Linux】调试器---gdb的使用

    文章目录 一 背景知识 二 安装gdb 三 gdb的用法 使用须知 gdb的常用指令 1 进入调试 2 退出调试操作 3 显示源代码 4 设置断点breakPoint 5 查看断点信息 禁用断点 开启断点 删除断点 6 运行程序 开始调试r
  • Kali Linux网络攻击

    文章目录 一 Kali Linux 使主机和虚拟机IP处于同一网段 1 关机 点击edit 虚拟机 2 网络连接 选择桥接bridge模式 3 现在开机 就和主机在同一网段下 可以fping g查找其它的IP地址了 二 查看局域网下所有ip
  • linux下查看某服务端口对应的进程ID

    Linux下查看某端口号所对应的进程ID 使用lsof命令 格式为 lsof i 端口号 例如 lsof i 30000 root Web Service CAServer lsof i 30000 COMMAND PID USER FD
  • Linux操作系统之基础命令

    文章目录 一 初识LInux操作系统 Linux操作系统和Windows操作系统的区别 Linux 分为内核版本和发行版本 目录结构命令 二 常用命令 1 ls命令 查看路径下所存在的文件 2 cd命令 切换路径 3 clear 清屏命令
  • Linux操作系统之tcp并发编程

    一 tcp并发编程 运行结果 多线程运行代码 运行结果 二 发送缓冲区与接收缓冲区 运行结果 为什么会出现以上的现象呢 因为在服务端与客户端都存在发送缓冲区与接收缓冲区
  • 操作系统课程实践5_进程通信

    一 实验目的 1 初步了解Linux环境下进程创建和进程间通信的机制 2 掌握如何利用消息和共享内存进行通信的原理 3 利用POSIX API函数编写实例程序 4 实现父子进程间通过消息传递和共享内存方式进行通信 二 实验内容 编制两个程序
  • Linux操作系统之进程间通讯—共享内存与消息队列

    文章目录 一 共享内存 1 共享内存的原理 2 共享内存的实现 三 消息队列 1 消息队列原理 2 消息队列实现 一 共享内存 1 共享内存的原理 共享内存为多个进程之间共享和传递数据提供了一种有效的方式 共享内存是先在物理内存上申请一块空
  • Linux 对函数库的理解

    一 前言 我们的C程序中 并没有定义 printf 的函数实现 且在预编译中包含的 stdio h 中也只有该函数的声明 而没有定义函数的实现 那么 是在哪里实 printf 函数的呢 最后的答案是 系统把这些函数实现都被做到名为 libc
  • RedHat系统NetworkManage网络管理工具简介及相关命令(lspci、lshw)

    1 RedHat网络管理工具简介 在早期的Linux发行版本中几乎所有的网络服务都是network服务 从RHEL7开始 红帽官方建议采用NetworkManage方式配置网络 而不建议再使用network服务这种传统的方式配置网络 因为网
  • Linux服务器启动tomcat的三种方式

    直接进入主题 首先cd进入tomcat的bin文件夹下 然后可以尝试以下三种启动方式 第一种 当前会话启动 startup sh 效果 然后tomcat就在后台启动了 我们还可以在当前会话中继续输入其它指令 比如 ps ef grep to
  • 一个进程可以创建多少线程?

    理论上 一个进程可用虚拟空间是2G 默认情况下 线程的栈的大小是1MB 所以理论上一个进程可以创建2048个线程 当然更改编译器的设置可以创建多余2048个线程 因此 一个进程可以创建的线程数由可用虚拟空间和线程的栈的大小共同决定 只要虚拟
  • Linux-fork(),vfork()和clone的区别

    在linux系统中 fork vfork 和clone函数都可以创建一个进程 但是它们的区别是什么呢 本文就这三者做一个较深入的分析 1 fork fork 函数的作用是创建一个新进程 由fork创建的进程称为子进程 fork函数调用一次返
  • 【Linux】Ubuntu20.04版本安装谷歌中文输入法【教程】

    Linux Ubuntu20 04版本安装谷歌中文输入法 教程 文章目录 Linux Ubuntu20 04版本安装谷歌中文输入法 教程 一 下载fcitx googlepinyin 二 配置Language Support Referen
  • Docker学习笔记

    五 Docker 1 简介 Docker是一个开源的应用容器引擎 是一个轻量级容器技术 Docker支持将软件编译成一个镜像 然后在镜像中各种软件做好配置 将镜像发布出去 其他使用者可以直接使用这个镜像 运行中的这个镜像称为容器 容器启动是
  • 32位机内存管理(下)

    既然这样 段描述符表放在那里呢 80386中引入了两个新的寄存器来管理描述符表 一个是48位的全局描述符表寄存器GDTR 一个是16位的局部描述符表寄存器LDTR 那么 为什么有两个描述符表寄存器呢 GDTR指向的描述符表为全局描述符表GD
  • 什么是软连接,以及软连接在linux系统中的用法

    软连接是linux中一个常用命令 它的功能是为某一个文件在另外一个位置建立一个同步的链接 软连接类似与c语言中的指针 传递的是文件的地址 更形象一些 软连接类似于WINDOWS系统中的快捷方式 例如 在a文件夹下存在一个文件hello 如果
  • 让我来教你如何免费使用RHEL小红帽系统

    RHEL安装注册过程中遇到的问题 从开始注册到正常使用 如何获取正版RHEL 注意事项 VMware虚拟机下载安装 安装中出现的问题 从开始注册到正常使用 答主是个动手能力比较强的人 所以当老师讲到Linux的时候 我就已经掌握了Linux
  • Centos 8.0中安装Redis服务器

    企业级开发中 经常需要把一些中间件安装在Linux服务上 主要考虑到linux服务器的性能吧 1 官网下载Linux版安装包 Redis 楼主使用的是 6 2 1 目前最新是6 2 6 差别不大 2 使用XShell 和Xftp连接Cent
  • Linux下软链接方法切换CUDA版本

    Linux下软链接方法切换CUDA版本 Linux下安装多版本的CUDA 直接切换版本 CUDA切换 sudo rm rf usr local cuda 删除之前的软链接 sudo ln s usr local cuda 10 0 usr

随机推荐

  • 二叉树的层序遍历(广度优先遍历)

    二叉树的层序遍历 Name 二叉树的层序遍历 Copyright Author lkm Date 01 04 22 21 47 include
  • Web开发权威指南笔记(三)

    书 Web开发权威指南 美 Chris Aquino Todd Gandee著 为3rd实战项目Chattrbox练习以及代码整理 全为个人借鉴本书产出 若需要转载请联系通知我 请尊重原创 谢谢 整理了大概8天了 内容比较多 很多重点都整理
  • Eigen: C++开源矩阵计算工具——Eigen的简单用法

    Eigen非常方便矩阵操作 当然它的功能不止如此 由于本人只用到了它的矩阵相关操作 所以这里只给出了它的一些矩阵相关的简单用法 以方便快速入门 矩阵操作在算法研究过程中 非常重要 例如在图像处理中二维高斯拟合求取光斑中心时使用Eigen提供
  • Android优秀开源项目汇总

    UI相关 图片 Android Universal Image Loader com nostra13 universalimageloader 异步加载 缓存 显示图片 ImageLoader com novoda imageloader
  • multipartFile.getOriginalFilename();不能获取原文件名称,也就是含有路径名

    一直在debug 发现只能获取文件名 进去看源代码 翻译过来就是 返回客户端文件系统中的原始文件名 p 这可能包含路径信息 取决于所使用的浏览器 但它通常不会与opera浏览器有关 只是可能包含路径名 所以我试了360浏览器 谷歌 火狐都只
  • 进程和线程的区别和联系

    一 简介 进程 进程是操作系统资源分配的基本单位 进程是指正在运行的程序实例 每个进程都有自己的内存空间 代码 数据和资源 操作系统通过管理进程来控制计算机的资源分配 每个进程都有一个唯一的标识符 称为进程 ID 以便操作系统可以识别和管理
  • Adapter 适配器基础讲解

    Adapter 适配器基础讲解 1 MVC模式的简单理解 在开始学习 Adapter 之前我们要来了解下这个 MVC 模式概念 举个例子 大型的商业程序通常由多人一同开 发完成 比如有人负责操作接口的规划与设计 有人负责程序代码的编写如果要
  • 表情包(图片)自生产——Python爬虫xpath实现

    文章目录 严正声明 爬虫应严格遵守国家的相关法律法规 坚决做一只文明爬虫 前言 一 知识准备 二 功能解析与实现 1 引入库 2 请求准备 3 发起请求 4 数据解析 5 数据保存 6 成果展示 三 普通代码展示 四 封装代码展示 总结 严
  • 核心基础知识1

    图片相关 安卓选择ETC2 8bit 苹果选择ETC PVRTC 4 bit RGBA32 32代表RGBA4个通道总共32位 每一个通道是8位 通常图片的格式有jpg和png jpg代表的是有损压缩无透明 png无损压缩有透明 显示同一张
  • 埋点--Vue前端通过自定义指令实现埋点功能

    需求 项目新版本新功能 需要再新页面添加埋点功能 记录用户的使用情况和使用习惯 因为前端项目使用的是Vue 所以选择使用Vue的自定义指令来实现埋点功能 埋点 主要记录 谁 什么时候 做了什么事情 直接上代码 1 自定义指令 import
  • HTML响应式Web设计

    目录 什么是响应式 Web 设计 创建自己的响应式设计 使用 Bootstrap 什么是响应式 Web 设计 RWD 指的是响应式 Web 设计 Responsive Web Design RWD 能够以可变尺寸传递网页 RWD 对于平板和
  • ARTS挑战打卡第十七周

    Algorithm 一周至少一道算法题 Review 阅读并点评至少一篇英文技术文章 Tip 学习至少一个技术技巧 总结和归纳在日常工作中所遇到的知识点 Share 分享一篇有观点和思考的技术文章 01 Algorthm https lee
  • xp系统开启iis服务器,WindowsXPHome版本安装IIS服务器方法

    首先在 开始 菜单的 运行 中输入 c Windows inf sysoc inf 系统会自动使用记事本打开sysoc inf这个文件 在sysoc inf中找到 Components 这一段 因为是XP简化版 所以里面东西很少 在里面加上
  • Tensorflow学习总结(1):CNN

    简介 CNN 卷积神经网络 是一种特殊的对图像识别的方式 属于非常有效的带有前向反馈的网络 CNN主要用于对二维图像的识别 它的网络结构对平移 比例放缩 倾斜或其他的变形具有高度不变性 因为 每层关注的特征不一样 贴近原图的 关注像素级别的
  • elasticsearch安装和使用

    一 全文检索基础 1 什么是全文检索 将 结构化数据中的 部分信息提取出来 重新组织 使其变得有 定结构 然后对此有 定结构的数 据进 搜索 从 达到搜索相对较快的 的 这部分从 结构化数据中提取出的然后重新组织的信息 我们称之索引 例如
  • 树状dp总结

    树的最长路径 树的最长路径 思路 每次都把每个点看成根节点之后进行向下进行遍历每次求最大 和次大值把他相加 不断进行搜索 include
  • Drm 例程2 双dumb buffer显示

    Drm 例程2 双buffer 显示 显示过程中 drm是通过申请framebuffer 填充其中的dumb的buf来显示的 drmModeAddFB对不同的dumb buff拿到的bufid也不一样 最终使用drmModeSetCrtc来
  • logminer使用笔记

    好久没写blog了 最近很忙 今晚想到我要想看某人都对oracle数据库做过什么修改呢 大家肯定回答 那还不简单 看数据库的日志啊 可oracle的日志 直接是不能看的 它是二进制的 oracle从8i就提供了一个非常好的日志管理工具log
  • vue 自定义水印插件

    1 新建directives js import Vue from vue author zuokun 水印 text 水印文字 font 字体 textColor 文字颜色 width 宽度 height 高度 textRotate 偏转
  • 32位机内存管理机制(上)

    一直有看linux内核的冲动 内核有些部分是汇编编写的 无奈汇编不大懂 所以利用五一三天假期大概走了一边8086CPU架构的汇编 8086CPU还是16位的 我们现在都进入64位时代了 这两者之间有很大的区别 但是看看16位的CPU汇编还是