内存映射与端口映射
2015-12-14 08:42
274 查看
一、概念理解
几乎每一种外设都是通过读写设备上的寄存器来进行的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped,也称“端口映射”),另一种是内存映射方式(Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构。
有些体系结构的CPU(如,PowerPC、m68k等)通常只实现一个物理地址空间(RAM)。在这种情况下,外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分。此时,CPU可以像访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。这就是所谓的“内存映射方式”(Memory-mapped)。
而另外一些体系结构的CPU(典型地如X86)则为外设专门实现了一个单独的地址空间,称为“I/O地址空间”或者“I/O端口空间”。这是一个与CPU的RAM物理地址空间不同的地址空间,所有外设的I/O端口均在这一空间中进行编址。CPU通过设立专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元(也即I/O端口)。这就是所谓的“I/O映射方式”(I/O-mapped)。与RAM物理地址空间相比,I/O地址空间通常都比较小,如x86 CPU的I/O空间就只有64KB(0-0xffff)。这是“I/O映射方式”的一个主要缺点。
二、展开
(本段参考derennet的文章设备地址与I/O内存映射)
在嵌入式编程中,绝大部分功能都是通过驱动外设实现的,这些外设不仅可以是CPU外部的某种功能模块,也可以是CPU芯片内部集成的某些器件。这些芯片内部的外设基本都是通过总线的方式与CPU核心相连,而对它们的控制也通过对这些总线上的外设寄存器的配置来实现。
外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。
但是外设寄存器与CPU核心寄存器不同,核心寄存器是有名字的,不同体系架构的寄存器名也不一样,这个体现在不同架构的编译器里;而外设寄存器是有地址的,不同CPU芯片会有不同总线连接方式,所以也会有不同的外设寄存器地址,有了地址以后,CPU核心寄存器就可以通过相应的外设寄存器地址去配置相应设备的动作了。
CPU对外设IO端口物理地址的编址方式 有两种:
一种是I/O映射方式(I/O-mapped)称为端口映射,另一种是存储空间映射方式(Memory-mapped),称为内存映射。具体采用哪一种取决于CPU的体系结构。
端口映射的典型代表是MCS-51系列单片机和x86体系,这种映射需要有独立的地址空间对应外设地址,而且还需要另外的汇编命令来控制。如51单片机的sfr特殊功能寄存器就是一个特别的命令来控制外设,而sfr所管理的128B的地址也是与RAM地址独立的,有兴趣的同学可以搜索下sfr的相关介绍。
内存映射是嵌入式设备体系用的比较多的方式,我们熟知的ARM体系,PowerPC就是用了这种与物理RAM地址统一编址的方式。
如STM32里对各种外设寄存器的操作就使用了简单的指针方式:
#define rGPACON (*(volatile unsigned *)0x7F008000) //Port Acontrol
相应的外设寄存器地址可以通过芯片的datasheet找到。下图是s3c6410 datasheet的截图
通过指针配置外设得到的方便,在STM32的编程中你完全可以体会到它的便利。但是这仅仅是在裸机程序上,到操作系统层面上,原本简单的东西也会变得复杂。。。
几乎每一种外设都是通过读写设备上的寄存器来进行的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped,也称“端口映射”),另一种是内存映射方式(Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构。
有些体系结构的CPU(如,PowerPC、m68k等)通常只实现一个物理地址空间(RAM)。在这种情况下,外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分。此时,CPU可以像访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。这就是所谓的“内存映射方式”(Memory-mapped)。
而另外一些体系结构的CPU(典型地如X86)则为外设专门实现了一个单独的地址空间,称为“I/O地址空间”或者“I/O端口空间”。这是一个与CPU的RAM物理地址空间不同的地址空间,所有外设的I/O端口均在这一空间中进行编址。CPU通过设立专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元(也即I/O端口)。这就是所谓的“I/O映射方式”(I/O-mapped)。与RAM物理地址空间相比,I/O地址空间通常都比较小,如x86 CPU的I/O空间就只有64KB(0-0xffff)。这是“I/O映射方式”的一个主要缺点。
二、展开
(本段参考derennet的文章设备地址与I/O内存映射)
在嵌入式编程中,绝大部分功能都是通过驱动外设实现的,这些外设不仅可以是CPU外部的某种功能模块,也可以是CPU芯片内部集成的某些器件。这些芯片内部的外设基本都是通过总线的方式与CPU核心相连,而对它们的控制也通过对这些总线上的外设寄存器的配置来实现。
外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。
但是外设寄存器与CPU核心寄存器不同,核心寄存器是有名字的,不同体系架构的寄存器名也不一样,这个体现在不同架构的编译器里;而外设寄存器是有地址的,不同CPU芯片会有不同总线连接方式,所以也会有不同的外设寄存器地址,有了地址以后,CPU核心寄存器就可以通过相应的外设寄存器地址去配置相应设备的动作了。
CPU对外设IO端口物理地址的编址方式 有两种:
一种是I/O映射方式(I/O-mapped)称为端口映射,另一种是存储空间映射方式(Memory-mapped),称为内存映射。具体采用哪一种取决于CPU的体系结构。
端口映射的典型代表是MCS-51系列单片机和x86体系,这种映射需要有独立的地址空间对应外设地址,而且还需要另外的汇编命令来控制。如51单片机的sfr特殊功能寄存器就是一个特别的命令来控制外设,而sfr所管理的128B的地址也是与RAM地址独立的,有兴趣的同学可以搜索下sfr的相关介绍。
内存映射是嵌入式设备体系用的比较多的方式,我们熟知的ARM体系,PowerPC就是用了这种与物理RAM地址统一编址的方式。
如STM32里对各种外设寄存器的操作就使用了简单的指针方式:
#define rGPACON (*(volatile unsigned *)0x7F008000) //Port Acontrol
相应的外设寄存器地址可以通过芯片的datasheet找到。下图是s3c6410 datasheet的截图
通过指针配置外设得到的方便,在STM32的编程中你完全可以体会到它的便利。但是这仅仅是在裸机程序上,到操作系统层面上,原本简单的东西也会变得复杂。。。
相关文章推荐
- MongoDB(四)——管理架构
- 13 适配器
- leetcode Add Two Numbers
- ecilpse 错误举例
- 在设计模式关系类
- ISoftWare 1
- 从jsp向servlet传送数据的两种方式
- Oracle数据库迁移-基础
- dwz dialog文件上传成功后更新
- JAVA中StringBuffer类常用方法详解
- 音频视频
- 方法的重载与重写区别
- Calculate Leave-One-Out Prediction for GLM
- ORACLE 迁移
- python学习日记_第五天(ex12~13)
- 重写和重载的区别
- java项目——java中线程共享数据同步解决办法
- mysql数据库配置安装
- 北京Uber优步司机奖励政策(12月14日)
- POJ3278 Catch That Cow 简单BFS