摘要:要想搞懂虚拟地址,物理地址,IO地址是什么?有什么区别?就要先搞懂MMU。
1 什么是MMU?
1.1 MMU的发展历史
我们通过百度百科中MMU的发展历史,来认识一下MMU。
许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但是,随着图形界面的兴起还有用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,不久人们找到了一个解决办法这就是虚拟存储器。
虚拟存储器的基本思想是程序,数据,堆栈的总的大小可以超过物理存储器的大小,操作系统把当前使用的部分保留在内存中,而把其他未被使用的部分保存在磁盘上。显然,伴随着这种技术的出现,CPU看到的是一大块连续的虚拟地址,而现实中是一块较小的物理地址,此时就需要实现虚拟地址和物理地址的映射功能。
自此,MMU就应用而生了,MMU是处理器中用来管理虚拟存储器、物理存储器的控制线路,也负责虚拟地址和物理地址的映射功能,以及提供硬件机制的内存访问授权。
1.2 MMU的作用
如果处理器没有MMU,CPU内部执行单元产生的内存地址信号将直接通过地址总线发送到芯片引脚,被内存芯片接收,这就是物理地址(physical address),简称PA。相反,如果处理器有MMU且启用,CPU内部执行单元产生的内存地址信号先被MMU截获,MMU把内存地址映射为物理地址,然后发送到内存芯片所在地址引脚上,被内存芯片接收,此时这个内存地址称为虚拟地址(virtual address),简称VA。用一句话表述就是:无MMU时一切皆物理地址(此时无虚拟地址的概念);有MMU时处理器看到的皆虚拟地址。
通常,现代的多用户多进程操作系统都有MMU,因为MMU通过地址映射使每个进程同时拥有自己独立的地址空间的目标。x86架构的处理器,都集成有MMU。arm架构的处理器,需要查询用户手册或DATASHEET才可知道是否有MMU。
2 什么是物理地址,虚拟地址,IO地址?
2.1 什么是虚拟地址?什么是物理地址?
举个例子,对于一台内存为256M的32bit x86处理器的主机来说,它的虚拟地址空间的范围是0~0xFFFFFFFF(4G),而物理地址空间的范围是0x00000000~0x0FFFFFFF(256M)。即,虚拟地址是由处理器的地址线决定的;而物理地址其实就是PC的内存。
而实际上,Linux运行在虚拟地址空间,并负责把系统中实际存在的远小于4GB的物理地址空间(物理内存)根据不同需求映射到整个4GB的虚拟地址空间中。这就说同一块物理内存可能映射到多处虚拟内存地址空间上,这正是Linux内存管理职责所在。
2.2 什么是物理地址空间?什么是虚拟地址空间?什么是IO地址空间?
在支持MMU的32bit嵌入式处理器的系统中,Linux的物理地址空间布局和处理器相关,详细情况可以从处理器用户手册的Memory Map表格章节查询到。
在支持MMU的32bit嵌入式处理器的系统中,当系统做完硬件初始化后就使能MMU功能,这样整个系统就运行在虚拟地址空间上,而虚拟地址空间与物理地址空间的映射关系是由Linux内核来管理的,Linux内核中虚拟地址空间的布局,网上一搜一大堆而且很详细,这里不再重述,
重点看高端内存由来和高端内存。
在支持MMU的32bit嵌入式处理器的系统中,IO地址空间其实被包含在处理器的物理地址空间布局中。
注意,这里参考了:
http://hujianjust.blog.163.com/blog/static/72455072201042795435529/,链接文章不仅精辟详尽,而且通俗易懂,此文被很多人转载。链接文章参考了另外两篇文章,其中第一个参考链接:
http://blog.csdn.net/do2jiang/article/details/5450839;其中第二个参考链接来应该是来自于一本书,由于没找到,可参看:
阅读(3009) | 评论(0) | 转发(0) |