物理地址空间和虚拟地址空间
2018-02-18 21:43
267 查看
http://blog.csdn.net/jiasike/article/details/38852485
一、物理地址(空间)
因为CPU是32位的,其地址总线是32位的,所以其地址总线可编码的个数是2^32(4G),这2^32个物理地址的集合就是物理地址空间。这与38译码器的道理是一样的,这一点很好理解。
二、虚拟地址(空间)
大多数计算机使用8位的块,或者叫做字节(Byte),来作为最小的可寻址的存储器单元,而不是访问存储器中单独的位。
机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器。存储器的一个字节都由唯一的数字来标识,称为它的地址(虚拟地址)。所有可能虚拟地址的集合就称作虚拟地址空间。
——引自《深入理解计算机系统》P23
从上面这段话,我们可以得到2个信息:
1、虚拟地址依赖于“唯一的数字标识”。
2、虚拟地址空间依赖于“所有可能虚拟地址的集合”
稍稍提炼一下,其实这就是说:虚拟地址空间就是数字可能的表示范围。
对于32位CPU而言,数据总线是32位的,所表示的数据或者说字长是32位的。所以数字的可能表示范围就是2^32(4G)。也就是说,虚拟地址空间是4G。
小小结:
物理地址空间的大小是由地址总线决定的。
虚拟地址空间的大小是由字长决定的。
cpu看到的都是vm(虚拟地址)(在开启mmu之后),所以程序中操作的都必须是映射后的地址空间(无论是内存映射后还是总线上挂载的其他模块)
内存映射其实就是物理地址映射到虚拟地址空间的一个子集,在映射这个层面内存和挂载在总线上的其他模块没有什么区别
映射表是映射表,内存是内存。内存是映射表的一部分,寄存器也是映射表的一部分。除非你用ioremap把寄存器映射到内存上,否则就是通过总线直接写寄存器
一、物理地址(空间)
因为CPU是32位的,其地址总线是32位的,所以其地址总线可编码的个数是2^32(4G),这2^32个物理地址的集合就是物理地址空间。这与38译码器的道理是一样的,这一点很好理解。
二、虚拟地址(空间)
大多数计算机使用8位的块,或者叫做字节(Byte),来作为最小的可寻址的存储器单元,而不是访问存储器中单独的位。
机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器。存储器的一个字节都由唯一的数字来标识,称为它的地址(虚拟地址)。所有可能虚拟地址的集合就称作虚拟地址空间。
——引自《深入理解计算机系统》P23
从上面这段话,我们可以得到2个信息:
1、虚拟地址依赖于“唯一的数字标识”。
2、虚拟地址空间依赖于“所有可能虚拟地址的集合”
稍稍提炼一下,其实这就是说:虚拟地址空间就是数字可能的表示范围。
对于32位CPU而言,数据总线是32位的,所表示的数据或者说字长是32位的。所以数字的可能表示范围就是2^32(4G)。也就是说,虚拟地址空间是4G。
小小结:
物理地址空间的大小是由地址总线决定的。
虚拟地址空间的大小是由字长决定的。
cpu看到的都是vm(虚拟地址)(在开启mmu之后),所以程序中操作的都必须是映射后的地址空间(无论是内存映射后还是总线上挂载的其他模块)
内存映射其实就是物理地址映射到虚拟地址空间的一个子集,在映射这个层面内存和挂载在总线上的其他模块没有什么区别
映射表是映射表,内存是内存。内存是映射表的一部分,寄存器也是映射表的一部分。除非你用ioremap把寄存器映射到内存上,否则就是通过总线直接写寄存器
相关文章推荐
- 在用户态进行虚拟空间地址向物理空间地址的转换
- 在用户态进行虚拟空间地址向物理空间地址的转换
- 在用户态进行虚拟空间地址向物理空间地址的转换
- 在用户态进行虚拟空间地址向物理空间地址的转换
- cpu为什么使用虚拟地址到物理地址的空间映射,解决了什么样的问题?
- [Konwledge]物理地址(空间)与虚拟地址(空间)
- 用户空间的虚拟地址如何转换得到实际的物理地址
- s3c2410物理地址和虚拟地址空间
- 虚拟和物理地址空间
- Unix v6中对虚拟地址映射到物理地址以及在内核态如何访问用户空间的u值
- Linux 内核空间虚拟地址和物理地址相互转换
- 我理解的逻辑地址、线性地址、物理地址和虚拟地址(补充完整了) referenced by 独孤九贱
- 解读物理地址、虚拟地址关系。
- Linux虚拟地址空间布局以及进程栈和线程栈总结
- linux 内存管理逻辑地址,物理地址以及虚拟地址
- 【Linux内存管理】虚拟地址、逻辑地址、线性地址、物理地址之间的转换
- 虚拟地址到物理地址的转换步骤【转】
- 虚拟地址转换成物理地址
- 转: 内核中通过虚拟地址找到物理地址例子
- 浅谈“设备物理地址与虚拟地址在kernel中的映射”