虚拟地址到物理地址的地址变换过程

2015-05-09  青岛  张俊浩

内容部分来自《Unix内核源码剖析》

软件环境:UNIX V6

硬件环境:PDP-11/40(16位计算机)

第二章《进程》一节阐述了PDP-11/40的虚拟地址到物理地址的地址变换过程。

MMU通过APR(Active Page Register)寄存器将虚拟地址变换为物理地址。

APR寄存器由一个PAR(Page Address Register)寄存器和一个PDR(Page Description Register)寄存器构成。

内核通过向与执行进程相对应的、供用户进程用使用的APR设定适当的值,保证各用户拥有独立的虚拟地址空间。

APR共有8组,APR[0]-APR[7]。进程的虚拟地址空间以页或者段为单位进行管理,一组APR对应一页。APR{PAR,PDR},PAR用来保存与各页物理地址的基地址有关信息,PDR用来保存各页的块(以64字节为单位)数以及是否允许访问等信息。每一页最多可以分配128个块(8KB)。

【虚拟地址到物理地址的转化过程】:虚拟地址的高位3比特决定了对应的页(APR),APR的11-0位决定了物理地址基地址的块地址,加上虚拟地址的12-6比特得到物理内存的块地址,再加上作为块内偏移值的虚拟地址的5-0位,就得到了最后的地址。(如下图所解析~)

上面解析了PDP-11/40中MMU的虚拟地址到物理地址的转化过程,但我们继续思考,为什么处理器对内存管理采用“虚拟地址空间”概念,这样做有什么好处?虚拟地制定本质是什么?

1.采用“虚拟地址空间”的优势:

(1)实现对内存访问的管理。不同进程使用的虚拟地址彼此隔离。如果程序能直接访问物理地址,也就能访问其他进程正在使用的物理内存区域,今儿可能是其他进程或者操作系统崩溃。一个进程中的代码无法更改正在由另一进程使用的物理内存。

(2)提高内存的使用效率。通过将不连续的物理内存区域映射到连续的虚拟内存区域,程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻(MMU完成相应的映射)的大内存缓冲区;程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区,当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件,数据或代码页会根据需要在物理内存与磁盘之间移动。

3)编程效率。虚拟地址是可重定位程序(ELF)实现的基础,对于每个程序来说是一块从0到2的N次方(这里N=16)的“虚拟”内存,MMU会完成虚拟地址到内存物理地址的转化~

2.采用“虚拟地址空间”的本质:

与其说虚拟地址,倒不如说内核给程序(代码段、数据段)提供了统一的访问模式(抽象出统一的访问模式)基址加偏移量(这也是内存的分层次的断页管理模式)。所以所有程序的编码你可以从假设的“0”基址开始开始编程,具体基址操作系统设定并由MMU完成地址转化~

时间: 2024-12-28 02:31:58

虚拟地址到物理地址的地址变换过程的相关文章

虚拟存储器--虚拟地址与物理地址

计算机在运行程序时,需将代码加载入内存中,CPU读取内存中的代码并执行. 早期的计算机在没有引入 虚拟存储器之前,需将整个待运行的程序加载到内存中,因为内存空间有限,当待加载的程序过大时就会出现问题(多进程,则需要占用更多的内存空间). 现代计算机引入虚拟存储器的概念,通过将对内存进行抽象,将其作为存储在硬盘上数据的高速缓存,只将当前进程部分代码缓存到主存中(当前进程的程序较少时,可以全部缓存在主存中),从而提高了主存的利用率,使其同时可以容纳更多的进程同时运行. 简述虚拟存储器是一个抽象概念,

虚拟地址与物理地址之间的关系

MMU 请点评 现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要处理器中的MMU(Memory Management Unit,内存管理单元)提供支持,本节简要介绍MMU的作用. 首先引入两个概念,虚拟地址和物理地址.如果处理器没有MMU,或者有MMU但没有启用,CPU执行单元发出的内存地址将直接传到芯片引脚上,被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址(Physical Address,以下简称PA),如下图所示.

Linux驱动虚拟地址和物理地址的映射

一般情况下,Linux系统中,进程的4GB内存空间被划分成为两个部分------用户空间和内核空间,大小分别为0~3G,3~4G. 用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核空间. 每个进程的用户空间都是完全独立.互不相干的,用户进程各自有不同的页表.而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的.内核空间地址有自己对应的页表,内核的虚拟空间独立于其他程序. 3~4G之间的内核空间中,从低地址到高地址依次为:物理内存映射区-隔离带-vmalloc虚拟内存分配区-隔

Linux虚拟地址和物理地址的映射

?背景 一般情况下,Linux系统中,进程的4GB内存空间被划分成为两个部分------用户空间和内核空间,大小分别为0~3G,3~4G.用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核空间.每个进程的用户空间都是完全独立.互不相干的,用户进程各自有不同的页表.而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的.内核空间地址有自己对应的页表,内核的虚拟空间独立于其他程序.3~4G之间的内核空间中,从低地址到高地址依次为:系统物理内存映射区-隔离带-vmalloc虚拟内存分配

Linux驱动虚拟地址和物理地址的映射(转)

原文地址:http://blog.chinaunix.net/uid-20792373-id-2979673.html 参考链接: Linux 虚拟地址与物理地址的映射关系分析  https://blog.csdn.net/ordeder/article/details/41630945 虚拟地址映射到物理地址的学习(linux篇) https://blog.csdn.net/chablin/article/details/79827226 linux--物理地址到虚拟地址映射,ioremap(

cpu为什么使用虚拟地址到物理地址的空间映射,解决了什么样的问题?

当处理器读或写入内存位置时,它会使用虚拟地址.作为读或写操作的一部分,处理器将虚拟地址转换为物理地址.通过虚拟地址访问内存有以下优势: 程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区. 程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区.当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件.数据或代码页会根据需要在物理内存与磁盘之间移动. 不同进程使用的虚拟地址彼此隔离.一个进程中的代码无法更改正在由另一进程使用的物理内存.

Linux 虚拟地址与物理地址的映射关系分析

Ordeder原创文章,原文链接: http://blog.csdn.net/ordeder/article/details/41630945 源码版本 2.4.0 1. 虚拟空间 0-3G 用户空间  0x00000000  ~ 0xbfffffff 3-4G 内核空间     0xc0000000 ~ 0xffffffff 每个用户进程都有独立的用户空间(虚拟地址0-3),而内核空间是唯一的(相当于共享) 每个进程的用户空间用mm_struct描述,即task_struct.mm. 2.进程

虚拟地址和物理地址

物理地址: 放在寻址总线上的地址.放在寻址总线上,如果是读,电路根据这个地址每位的值就将相应地址的物理内存中的数据放到数据总线中传输.如果是写,电路根据这个地址每位的值就将相应地址的物理内存中放入数据总线上的内容.物理内存是以字节(8位)为单位编址的. 虚拟地址:每个进程有4GB的虚拟地址空间,每个进程自己的一套页目录和页表.基于分页机制,4G的地址空间被分成了固定大小的页,每一页或者被映射了物理内存,或者映射硬盘上的交换文件,或者什么也没有映射.程序中使用的都是4GB地址空间中的虚拟地址.而访

]Linux中的虚拟地址、物理地址和内存管理

Linux中的虚拟地址.物理地址和内存管理方式: http://m.blog.csdn.net/blog/yinjingyu_bisheng/8943650 Linux内存管理之mmap详解 : http://blog.chinaunix.net/uid-26669729-id-3077015.html Linux驱动虚拟地址和物理地址的映射 : http://blog.chinaunix.net/uid-25120309-id-3986354.html