本文参考了 主存与CPU的连接(字扩展,位扩展,芯片的地址分配)文章中的部分文字和图片,这里向作者致敬。

前言

对于硬件开发工程师来说,尤其是初学者,地址空间分配原理是比较难以理解的,起码对于我来说,是比较抽象的,可能是我比较笨吧。我们在编程时,芯片手册会直接告诉我们外设的起始地址,比如STM32(cortex-M3)的SRAM的起始地址为0x20000000,其他外围的寄存器也有相关的地址,尤其是对于扩展的RAM芯片,其分配的地址不是0,而是0x68000000,所以这里就会有个疑问,CPU的地址空间分配是什么原理?难道外围芯片的地址就默认不是0吗?等等。

概念1:外围设备的地址都是从0开始

前面讲到,CPU访问外设的地址不是从0开始,这并不意味着外围设备自己的物理地址也不是从0开始的,这样说可能不太严谨,但是从方便理解的角度看,确实是这样的,因为外围设备种类有太多,规定一个非0的起始地址,远没有规定从0开始方便,所以我们有个结论:
外围设备、硬件的物理地址都是从0开始的。包括内存条、显卡、串口等等。

概念2:CPU与外围设备的链路

之所以想不到**“外围设备地址都是从0开始”**的原因,是因为在相关的教材学习中,使用了CPU-外围链路简化模型,如下图所示:

简化链路


从上图中,我们很容易会联想到,CPU的地址空间是按照约定来分配的。设备的地址之和为CPU的地址范围。这样的模型,只是在应用层面来看的,反而会对原理的理解会有混淆。

标准链路


该图的地址分配电路可能不太严谨,但是对于我们理解是很有帮助的,CPU中也确实有相应功能的硬件,标准图与简化图相比有两点区别:

  • 1、外围设备的物理地址的起始都是从0开始的。
  • 2、在CPU地址总线和外围设备之间,增加了地址分配电路,地址分配电路负责将CPU的规划分段地址,转换为相应类型的外围设备地址。

地址映射举例

我们以Cortex-M3架构的地址分配为例,STM32F系列就是Cortex-M3架构,该架构在单片机领域中应用非常广泛:

图中的地址分配,显然跟前面讲到的简化链路对应的,比如SRAM的起始地址为0x20000000,我们在编写应用程序时,只需要知道,对于内存的读写,起始地址为0x20000000,CPU会自动的去读写SRAM的,并不会考虑那个地址分配器的工作。

地址分配原理

前面的讲述偏理论,可能还不太容易理解,我们以真实的设备来分析,假如我们现在需要扩展存储器容量,为了降低理解的难度,我们假设CPU为扩展存储器分配的起始地址从0开始。
存储扩展连接方法:

  • 1、将个存储器芯片的地址线、片选线、读/写线并联。
  • 2、将个存储器芯片的数据线分别接到数据总线的对应位上。

如下图所示:

扩展需求:
假如我们需要扩展64Kx8位存储器,而单片存储器的容量为16Kx8位,则:

  • 1、64Kx8 bit需要16位地址线A15-A0, 而16Kx8 bit的片内地址线为A13-A0.
  • 2、所以16位地址线的低14位A13~A0作为片内寻址,高两位A15、A14用于片选。
  • 3、外围存储器从0x0000开始连续编址,则4块芯片的地址分配为:
  • (1) 第1片地址范围:0x0000~0x3FFF
  • (2) 第2片地址范围:0x4000~0x7FFF
  • (3) 第3片地址范围:0x8000~0xBFFF
  • (3) 第3片地址范围:0xC000~0xFFFF

    从上图中,我们可以看到:每片芯片的物理访问地址是不同的,但是对于A0~A13来说,都是从0开始的。

硬件电路原理图:

从图中我们可以看到,地址的分段,其实是通过片选实现的,而片选本质上是开关,控制芯片的选通和断开,只不过在地址的角度看,是分段了,但是对于各自芯片来讲,地址还是从0开始的。

小结

1、地址空间的分配是通过地址分配电路来实现的。
2、外围设备的物理地址,一定是从0开始的。
3、应用编程时,外围设备的访问地址非0,这是给程序员用的,但是最后给外围芯片的物理地址一定是从0开始的。

CPU 地址空间分配原理分析相关推荐

  1. 普通下载url与迅雷快车旋风下载地址转换原理分析

    例如华军winrar 3.71的下载地址是普通下载url与迅雷快车旋风下载地址转换原理分析_千里疯狂 http://p2s.newhua.com/down/wrar371sc.exe 1.普通地址转换 ...

  2. 迅雷,快车,旋风,飞速地址转换原理分析

    firefox迅雷地址转换插件,ccdos制作,下载地址在本博克的友情链接中的 我的软件和资料共享下载 linux相关软件  目录下saolei-0.4.xpi 下载后直接拖入firefox窗口,即可 ...

  3. 迅雷/旋风地址转换原理分析(转)

    Base64编码是一种加密/解密字符串的算法  他可以把一段字符串A通过特定的加密算法变成字符串B  并且单凭你的肉眼是无法通过B来反推出A来  但通过逆推算法便能很迅速的将字符串B转换为字符串A  ...

  4. 单周期CPU设计与实现原理分析

    文章目录 单周期CPU设计与实现原理分析 一.单周期CPU的设计思路 二.单周期CPU的模块实现 ① Instruction Memory指令存储器的设计 ② ALU算术逻辑单元的设计 ③ PC程序计 ...

  5. php 浏览器能请求post_PHP解析微视无水印播放地址原理分析

    天涯乌鸦一般黑,微视短视频平台和快手一样,通过访问分享链接h5就能获取到无水印播放地址. 页面分析 先随便撸一个微视短视频分享链接,就勉强以下面这个为例吧 https://h5.weishi.qq.c ...

  6. PCI Express解析——系列文章【5】:PCIe原理分析之——PCI Express 配置解析(BDF、BAR)、 MEM Read举例

    PCI Express解析--系列文章[5]:PCIe原理分析之--PCI Express 配置解析BDF.BAR. MEM Read举例 2.5 Memory Read举例 (1)事务层TLP包准备 ...

  7. 深入理解CPU的调度原理

    前言 软件工程师们总习惯把OS(Operating System,操作系统)当成是一个非常值得信赖的管家,我们只管把程序托管到OS上运行,却很少深入了解操作系统的运行原理.确实,OS作为一个通用的软件 ...

  8. c++ map 获取key列表_好未来Golang源码系列一:Map实现原理分析

    分享老师:学而思网校 郭雨田 一.map的结构与设计原理 golang中map是一个kv对集合.底层使用hash table,用链表来解决冲突 ,出现冲突时,不是每一个key都申请一个结构通过链表串起 ...

  9. freertos内核 任务定义与切换 原理分析

    freertos内核 任务定义与切换 原理分析 主程序 任务控制块 任务创建函数 任务栈初始化 就绪列表 调度器 总结任务切换 主程序 这个程序目的就是,使用freertos让两个任务不断切换.看两个 ...

最新文章

  1. iOS Plist 文件的 增 删 改
  2. 每天学一点儿shell:xargs 命令
  3. python写游戏棋牌游戏_使用python实现简单五子棋游戏
  4. apache jmx_用于JMX访问的Apache Ant任务
  5. java操作redis redis连接池
  6. 牛市该理智还是疯狂?python+BI可视化的股票分析,都是你想看的
  7. 在Python中使用设置文件的最佳做法是什么? [关闭]
  8. linux查看及修改文件权限以及相关
  9. 全球互联网进入后美国时代:在世界互联网大会上的演讲
  10. java_opts 与catalina_opts区别_CATALINA_OPTS和 JAVA_OPTS区别
  11. 怎么把html导入iphone,电脑上的视频怎么导入iphone8?电脑视频导入苹果手机教程...
  12. 简单的摄像头自写驱动程序总结
  13. Python3 利用阿里接口,根据银行卡号获取银行名称和logo
  14. 苹果手机可以微信分身吗_微信和微信分身版有区别吗
  15. PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed
  16. 聚观早报 | 蔚来手机公司正式成立;苹果将取消iPad全系耳机孔
  17. mysql添加表或字段注释
  18. java-对密码进行加密和验证的类
  19. 【单词辨析】technology,technique,skill 技术技能
  20. 【十五】 VVC/H.266 | 帧内帧间联合预测技术CIIP详解

热门文章

  1. win10新版wsl2使用指南
  2. MTK81系列 OTA更新升级路径转换
  3. excel催化剂_催化剂,抑制剂和变压器:十大主导力量塑造技术
  4. PdfPCell设置单元格内文字的行间距
  5. Android 如何设置应用不显示桌面图标,不显示后台运行
  6. 微擎学习随记_常用功能实现
  7. 自定义View之LOL能力七星图
  8. 今天说说阿里云邮件推送配置
  9. [有效]在overleaf中GB/T 7714把作者名字全大写改成小写
  10. 用超级弹弓把飞船射上月球