CPU工作原理和MMU初探

2023-11-09

具体相关内容主要参考自一篇博客,当然有结合其它内容,感谢博主提供的资源,这里附上参考链接,http://www.cnblogs.com/xiangtao/archive/2013/04/11/3014815.html

关于CPU和MMU需要做几点说明。

一、CPU

1、CPU核心功能单元

1)寄存器(register)

CPU内部的高速存储器,常见寄存器(eax,esp,eip等),有些寄存器只能用于某种特定的用途,比如eip用作程序计数器,这称为特殊寄存器(Special-purpose Register),而另外一些寄存器可以用在各种运算和读写内存的指令中,比如eax寄存器,这称为通用寄存器(General-purpose Register)。

具体见下图:

这些寄存器也被称为整数寄存器(Integer register),具体见http://blog.csdn.net/cutemmll/article/details/7171448

2)程序计数器(PC)

一种特殊寄存器,保存着CPU取下一条指令的地址,CPU按程序计数器保存的地址去内存中取指令然后解释执行,这时程序计数器保存的地址会自动加上该指令的长度,指向内存中的下一条指令。

注意的是,EIP寄存器,用来存储CPU要读取指令的地址,CPU通过EIP寄存器读取即将要执行的指令。每次CPU执行完相应的汇编指令之后,EIP寄存器的值就会增加。CPU每次执行控制器读取完,相应的就再通过EIP寄存器去进行下一次的读取指令工作。每次CPU读取指令到指令缓冲区,相应的EIP寄存器的值增加,增加大小的就是读取指令的字节大小。如果执行完JMP指令,则EIP值会直接变成后面要跳转的地址。

关于EIP,具体参考 http://blog.csdn.net/xzhang76/article/details/8158749

3)指令译码器

4)算数逻辑单元

如果译码器将一条指令解释为运算指令,就调动算术逻辑单元去做运算,比如加减乘除、位运算、逻辑运算。指令中会指示运算结果保存到哪里,可能保存到寄存器中,也可能保存到内存中。

5)地址和数据总线

CPU和内存之间用地址总线、数据总线和控制线连接起来,每条线上有1和0两种状态。如果在执行指令过程中需要访问内存,比如从内存读一个数到寄存器,执行过程可以想像成这样:

1.CPU内部将寄存器对接到数据总线上,使寄存器的每一位对接到一条数据线,等待接收数据。
2.CPU通过控制线发一个读请求,并且将内存地址通过地址线发给内存。
3.内存收到地址和读请求之后,将相应的内存单元对接到数据总线的另一端,这样,内存单元每一位的1或0状态通过一条数据线到达CPU寄存器中相应的位,就完成了数据传送。

2、CPU访问设备

CPU执行指令除了访问内存之外还要访问很多设备(Device)。连接示意图如下:

还有一些设备集成在处理器芯片中。在上图中,从CPU核引出的地址和数据总线有一端经总 线接口引出到芯片引脚上了,还有一端没有引出,而是接到芯片内部集成的设备上,无论是在CPU外部接总线的设备还是在CPU内部接总线的设备都有各自的地 址范围,都可以像访问内存一样访问,很多体系结构(比如ARM)采用这种方式操作设备,称为内存映射I/O(Memory-mapped I/O)。但是x86比较特殊,x86对于设备有独立的端口地址空间,CPU核需要引出额外的地址线来连接片内设备(和访问内存所用的地址线不同),访问 设备寄存器时用特殊的in/out指令,而不是和访问内存用同样的指令,这种方式称为端口I/O(Port I/O)。

从 CPU的角度来看,访问设备只有内存映射I/O和端口I/O两种,要么像内存一样访问,要么用一种专用的指令访问。其实访问设备是相当复杂的,计算机的设 备五花八门,各种设备的性能要求都不一样,有的要求带宽大,有的要求响应快,有的要求热插拔,于是出现了各种适应不同要求的设备总线,比如PCI、 AGP、USB、1394、SATA等等,这些设备总线并不直接和CPU相连,CPU通过内存映射I/O或端口I/O访问相应的总线控制器,通过总线控制 器再去访问挂在总线上的设备。所以上图中标有“设备”的框可能是实际的设备,也可能是设备总线的控制器。

访问设备还有一点和访问内存不同。内存只是保存数据而不会产生新的数据,如果CPU不去读它,它也不需要主动提供数据给CPU,所以内存总是被动地等待被读 或者被写。而设备往往会自己产生数据,并且需要主动通知CPU来读这些数据,例如敲键盘产生一个输入字符,用户希望计算机马上响应自己的输入,这就要求键 盘设备主动通知CPU来读这个字符并做相应处理,给用户响应。这是由中断(Interrupt)机 制实现的,每个设备都有一条中断线,通过中断控制器连接到CPU,当设备需要主动通知CPU时就引发一个中断信号,CPU正在执行的指令将被打断,程序计 数器会指向某个固定的地址(这个地址由体系结构定义),于是CPU从这个地址开始取指令(或者说跳转到这个地址),执行中断服务程序 (ISR,Interrupt Service Routine), 完成中断处理之后再返回先前被打断的地方执行后续指令。比如某种体系结构规定发生中断时跳转到地址0x00000010执行,那么就要事先把一段ISR程 序加载到这个地址,ISR程序是内核代码的一部分,在这段代码中首先判断是哪个设备引发了中断,然后调用该设备的中断处理函数做进一步处理。

由于各种设备的操作方法各不相同,每种设备都需要专门的设备驱动程序(Device Driver),一个操作系统为了支持广泛的设备就需要有大量的设备驱动程序,事实上Linux内核源代码中绝大部分是设备驱动程序。设备驱动程序通常是内核里的一组函数,通过读写设备寄存器实现对设备的初始化、读、写等操作,有些设备还要提供一个中断处理函数供ISR调用。

二、MMU

现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要处理器中的MMU(Memory Management Unit,内存管理单元)提供支持。这样就涉及到虚拟内存和物理内存的概念。

1)MMU功能

MMU主要用来做地址转换,事实上,过程是CPU每次执行访问内存的指令都会自动引发MMU做查表和地址转换操作,地址转换操作由硬件自动完成,不需要用指令控制MMU去做。

MMU除了做内存地址转换外,还提供内存保护的功能。现代操作系统通常把虚拟内存地址空间划分为用户地址空间和内核地址空间,例如x86平台的Linux系统虚拟地址空间是 0x00000000~0xffffffff,前3GB(0x00000000~0xbfffffff)是用户空间,后 1GB(0xc0000000~0xffffffff)是内核空间。

2)内存保护过程

当CPU要访问一个VA时,MMU会检查CPU当前处于用户模式还是特权模式,访 问内存的目的是读数据、写数据还是取指令,如果和操作系统设定的页面权限相符,就允许访问,把它转换成PA,否则不允许访问,产生一个异常 (Exception)。异常的处理过程和中断类似,不同的是中断由外部设备产生而异常由CPU内部产生,中断产生的原因和CPU当前执行的指令无关,而异常的产生就是由于CPU当前执行的指令出了问题,例如访问内存的指令被MMU检查出权限错误,除法指令的除数为0等都会产生异常。

CPU在产生中断或异常时不仅会 跳转到中断或异常服务程序,还会自动切换模式,从用户模式切换到特权模式,因此从中断或异常服务程序可以跳转到内核代码中执行。事实上,整个内核就是由各 种中断和异常处理程序组成的。总结一下:在正常情况下处理器在用户模式执行用户程序,在中断或异常情况下处理器切换到特权模式执行内核程序,处理完中断或 异常之后再返回用户模式继续执行用户程序。

段错误我们已经遇到过很多次了,它是这样产生的:
1.用户程序要访问的一个VA,经MMU检查无权访问。
2.MMU产生一个异常,CPU从用户模式切换到特权模式,跳转到内核代码中执行异常服务程序。
3.内核把这个异常解释为段错误,把引发异常的进程终止掉。


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

CPU工作原理和MMU初探 的相关文章

  • 【cartographer_ros】四: 发布和订阅里程计odom信息

    上一节介绍了激光雷达Scan传感数据的订阅和发布 本节会介绍里程计Odom数据的发布和订阅 里程计在cartographer中主要用于前端位置预估和后端优化 官方文档 http wiki ros org navigation Tutoria
  • openwrt 编译进阶

    1 编译703 8M固件 1 target linux ar71xx image Makefile eval call SingleProfile TPLINK LZMA fs 64kraw TLWR703 tl wr703n v1 TL
  • 计算机考研复试常问问题 计算机网络篇

    一 计算机网络体系结构 1 OSI TCP IP和五层体系结构 五层协议 分为5层 自上到下分别为 应用层 传输层 网络层 数据链路层 物理层 应用层 为特定应用程序提供数据传输服务 传输单位是报文 传输层 为不同主机的进程提供通信服务 传
  • 五金手册钢材理论重量计算小程序_常用金属重量计算公式,值得收藏

    这是金属加工 mw1950pub 发布的第11525篇文章 编者按 分享常用的一些金属材料重量计算公式 钢管重量计算公式 方钢重量计算公式 钢板重量计算公式 值得收藏 圆钢重量 公斤 0 00617 直径 直径 长度 方钢重量 公斤 0 0
  • RabbitMQ--基础--11.1--持久化,消息的保障机制,生产者确认机制,消费者处理消息的模式

    RabbitMQ 基础 11 1 持久化 消息的保障机制 生产者确认机制 消费者处理消息的模式 1 持久化 交换机的持久化 队列的持久化 消息的持久化 1 1 交换机的持久化 RabbitMQ服务重启 若交换机不设置持久化 交换机的元数据会
  • 使用Resource Hacker 更改exe文件图标(小白注意)

    当需要将已经封装好的exe文件更改其图标时 使用resource Hacker可以实现 1 打开软件 2 将exe文件直接拖拽带软件里 这里以优酷 exe为案例 这就是显示的exe文件的内容 3 更改图标要更改icon Group 文件夹
  • C#中解决ListView更新数据出现闪烁的实例程序

    在使用vs自动控件ListView控件时候 更新里面的部分代码时候出现闪烁的情况 解决办法使用双缓冲 添加新类继承ListView 对其重写 一 双缓冲作用 双缓冲甚至是多缓冲 在许多情况下都很有用 一般需要使用双缓冲区的地方都是由于 生产
  • FinClip小程序中如何对接微信登录?FinClip小程序如何接入APP的授权登录?

    通常来说 真正意义的微信小程序授权登录只能在微信的APP中进行 是指由微信APP授权给微信小程序 而FinClip小程序的授权登录则是通过集成了SDK的第三方APP进行授权 因为一般APP自己就具有账号体系 而在集成FinClip SDK的
  • vue-cli初始化

    1 全局安装vue cli npm install g vue cli 全局安装vue cli vue version 或者 vue V 查看版本 2 创建项目 vue create vue cli demo 常用命令 serve vue
  • bcdedit添加win7启动项

    公司的电脑是日文win7系统 安装在C盘 后来有需求 在E盘安装了中文win7 只是偶尔用用 后来日语系统出了问题 重新格式化C盘 重装了日文系统 中文系统也就进不去了 现在突然要用中文系统了 需要修复一下启动项 用管理员权限执行cmd 然
  • 前端报错。

    一 前端报500 打开网络请求 看响应 1 500错误码的官方解释是 500服务器内部错误 Internal server error 主要是由于IWAM账号的密码错误造成的 该错误说明IIS服务器无法解析ASP代码 访问一个静态页面试试是
  • QT笔记——使用重载的信号多种方法

    使用重载的信号 的 多种写法 接下来我们将使用QComboBox 的信号来举例 我们发现currentIndexChanged 这个信号是重载的 我们在正常写是编译不通过的 ui comboBox gt addItem QStringLit
  • CCF/CSP 201604-2 俄罗斯方块(满分题解Java版)

    此题 猛滴一看确实非常容易让人懵懵的 主要是题目描述的非常不清晰 很难让人能够透彻的理解 如果连题目都看不懂 那就不谈写出代码了 题目描述 官方题目描述 题目地址 题目解读 关键的是要理解题目 Java题解 import java util
  • JPA @Query时,无法使用limit函数原因及解决方案

    前言 使用ssh时 我加入了springdata jpa去查询sql 在 query中使用limit函数时 报错 后来分析原因才知道 springdata jpa的 query中写的sql叫JPQL jpql是不支持limit函数的 而原生
  • ubuntu vsocde 配置 pcl头文件库

    vscode 配置 pcl头文件库 ctrl shift p 输入Edit configuretion 在includePath种添加 usr include pcl 1 8 如果还是没有提示 那么要开启提示 将复选框取消就行 还可以修改提
  • 剑指offer 学习笔记 把字符串转换成整数

    面试题67 把字符串转换成整数 类似atoi函数 把一个字符串转换成一个整数 当输入非法时返回0 为了区分是由于输入0而返回0还是输入非法而返回0 而声明了一个全局变量g nStatus 为了防止溢出 可先将结果存入long long类型中
  • 安装FISCO-BCOS的那些坑

    首先从官网下载源码 git clone https github com FISCO BCOS FISCO BCOS git要是内网的时候可以将源码下载后放到服务器进行解压unzip filename zip 执行build 如果没有安装过
  • vscode使用ssh远程连接服务器时出现timeout情况的解决方法汇总

    背景 mobaxterm通过ssh能正常连接服务器 而在vscode里远程连接服务器时则提示连接超时 解决方法一 win R打开运行命令框 输入cmd打开命令提示符 在下图红圈位置右键然后选择属性 选择取消 使用旧控制台 U 解决方法二 右
  • Visual Studio 2022 include和lib路径问题

    最近安装了Visual Studio 2022 想试下opengl 首先是用cmake尝试编译 结果编译不过 一直报错 LINK fatal error LNK1104 无法打开文件 ucrtd lib 然后我新建了一个工程 导入了glfw

随机推荐

  • Xshell 6安装和使用教程

    作者 翁松秀 Xshell 6安装和使用教程 工欲善其事必先利其器 Xshell 6安装和使用教程 一 XShell 6的安装 二 XShell 6的使用 创建链接 快捷键 主题 三 XFTP的下载和安装 一 XShell 6的安装 到官网
  • 数据挖掘---分类算法之支持向量机SVM

    上篇已经简单的说了下支持向量机的理论 里面有不少公式 需要肯学习的你一步步的推导试一试 说实在的还是挺能考验数学能力的 当年俺老孙就是一步步的推导过 只有这样你才能对这个过程有清晰的认识 才能对这个算法有所体会 下面来举个例子 说说用支持向
  • call、apply和bind的区别

    首先说说call apply和bind的作用吧 它们的作用都是相同的 都是动态的修改当前函数内部环境对象this的指向 call apply和bind区别 相同点 作用相同 都是动态修改this指向 都不会修改原先函数的this指向 异同点
  • 使用学生邮箱注册jetbrains

    1 到 https www jetbrains com zh student 点击申请按钮开始申请 2 在表单上方选择申请方式填写相关信息后提交申请 使用校园邮箱 就是广外邮箱 格式是学号加 gdufs edu cn 例如201810023
  • 二分查找 递归

    碎碎念念 假设我们要在一个升序排序的整型数组中查找某个特定的整数 如果找到了 返回该整数在数组中的索引号 如果没有找到 则返回 1 我们首先看要找的数和数组中间的数的大小关系 如果相等 那么说明找到了 如果要找的数小于数组中间的数 那么我们
  • 由集成运放构成的基本运算电路

    一 比例运算放大器 1 同相比例运算放大器 2 反相比例运算放大器 二 相加器 1 反向相加器 2 同向相加器 3 相减器 根据叠加原理 如上相减器可拆分为如下两个相加器 第一图 第二图 三 积分器 1 简单积分器 2 差动积分器 四 微分
  • 模拟上传文件至服务器(解决socket中read阻塞问题)

    客户端 package cn dali4 code03ex import java io FileInputStream import java io IOException import java io InputStream impor
  • python一行写不下,变多行

    python里一行写不下 拆成多行 和 两种方法 在一行末尾 加上 也就是空格加上 a sdfaf test 注意两个对象都要独立 字符串必须都用双引号引起 如果是if and 后加 其实用括号也可以 比如 a sdfaf test 或者
  • c语言实现学生管理系统,C语言学生管理系统源代码

    C语言学生管理系统源代码 由会员分享 可在线阅读 更多相关 C语言学生管理系统源代码 12页珍藏版 请在人人文库网上搜索 1 C语言学生成绩管理系统源代码 保证能用 include malloc h include stdio h incl
  • 【LVGL 学习】LVGL 在 arduino 环境的安装

    1 前提条件 使用 arduino IDE开发 使用 ESP32 作为主控 屏幕使用 ST7789 驱动 240 240像素TFT屏幕 注意 屏幕驱动部分不再这个赘述 以后开贴另行发布 2 安装 LVGL 库 打开 arduino 菜单栏中
  • 【Python】熵值法计算权重

    Python 熵值法计算权重 将分步骤基于python实现熵值法计算权重 代码在pycharm中执行 文章目录 Python 熵值法计算权重 1 引入库 2 读取数据 3 熵值法主体 4 打印出各指标的权重 5 将结果存储至csv文件中 总
  • 数据库 SQL 遍历父子关系表(二叉树)获得所有子节点 所有父节点

    数据库 SQL 遍历父子关系表 二叉树 获得所有子节点 所有父节点 创建表 Create Table A IDInt fatherIDInt NameVarchar 10 Insert A Select 1 NULL tt Union Al
  • 使用Vector模拟实现STL中的stack

    stack 介绍 栈是一种容器适配器 特别为后入先出而设计的一种 LIFO 那种数据被插入 然后再容器末端取出 栈实现了容器适配器 这是用了一个封装了的类作为他的特定容器 提供了一组成员函数去访问他的元素 元素从特定的容器 也就是堆栈的头取
  • python之requests模块详解

    目录 requests使用 requests请求方法 requests响应对象属性 Requests模块是一个用于网络请求的模块 主要用来模拟浏览器发请求 其实类似的模块有很多 比如urllib urllib2 httplib httpli
  • 微信公众号【OpenID详解】

    只知道 openID 是微信号加密后得到的 不同的公众号获取得微信号openID不同 但 UnionID 是一样的 微信openid由用户id和公众号id加密而来 同一用户相对同一公众账号的openid是不变的 对于不同公众号 同一用户的o
  • Learning OpenStack Keystone

    Author 海峰 http weibo com 344736086 http yanheven github io http blog csdn net yanheven1 这周重新学习整理了OpenStack Keystone里面的知识
  • CentOS没有了用什么?Rocky Linux 8.6安装体验

    2020 年 12 月 8 日 CentOS 项目宣布 CentOS 8 将于 2021 年底结束 而 CentOS 7 将在其生命周期结束后停止维护 CentOS 7 9 和 CentOS 8 5 将是最后的2个CentOS 版本 官方解
  • concurrentHashMap解析这篇文章就够了

    实现原理 ConcurrentHashMap使用分段锁技术 将数据分成一段一段的存储 然后给每一段数据配一把锁 当一个线程占用锁访问其中一个段数据的时候 其他段的数据也能被其他线程访问 能够实现真正的并发访问 如下图是ConcurrentH
  • 使用 Python 操作 MongoDB

    使用 Python 操作 MongoDB MongoDB 是一个开源的面向文档的 NoSQL 数据库 它具有高性能 可扩展性和灵活性的特点 通过使用 Python 的 pymongo 模块 我们可以方便地操作 MongoDB 数据库 本文将
  • CPU工作原理和MMU初探

    具体相关内容主要参考自一篇博客 当然有结合其它内容 感谢博主提供的资源 这里附上参考链接 http www cnblogs com xiangtao archive 2013 04 11 3014815 html 关于CPU和MMU需要做几