1、地址概念
- 物理地址:物理内存就是真实的内存,CPU的地址线可以直接进行寻址的内存空间大小。比如在32位平台下,寻址的范围是2^32也就是4G,并且这是固定的。
- 在实际的应用中,很多的应用程序都比较大,计算机实际所配置的内存空间无法满足。所以出现了虚拟内存技术。经过不断有目的的换入和换出,处理器似乎是拥有了一个大于实际物理内存的内存空间。于是,这个存储空间叫做虚拟内存空间,而把真正的内存叫做实际物理内存,或简称为物理内存。
对32位处理器,虚拟内存空间为4G,每个进程都认为自己拥有4G的空间;实际上,在虚拟内存对应的物理内存上,可能只对应的一点点的物理内存。
进程得到的这4G虚拟内存是一个连续的地址空间(这也只是进程认为),而实际上,它通常是被分隔成多个物理内存碎片,还有一部分存储在外部磁盘存储器上,在需要时进行数据交换。
由于存在两个内存地址,因此一个应用程序从编写到被执行,需要进行两次映射。第一次是映射到虚拟内存空间,第二次时映射到物理内存空间。在计算机系统中,第两次映射的工作是由硬件和软件共同来完成的。承担这个任务的硬件部分叫做存储管理单元MMU,软件部分就是操作系统的内存管理模块了。
2、虚拟地址和物理地址的关系
分页就是把整个虚拟和物理内存切成一段段固定大小的空间,连续且尺寸固定的内存空间叫页,Linux下每一页大小4KB。
虚拟内存和物理内存之间通过页表来映射;虚拟地址分为:页号和页内偏移。
- 页号作为页表的索引,页表包含物理页每页所在物理内存的基地址,这个基地址与页内偏移的组合就形成了物理内存地址。
- 简单分页缺点:空间上的缺陷:32位,单进程一个页4KB,虚拟内存4GB,一个页表项4字节,结果是4GB空间映射需要4*2^20 = 4MB存储页表。多进程100,需要400MB。
解决方法:采用多级页表或段页式存储;
地址结构就由段号、段内页号和页内位移三部分组成。
- 第⼀次访问段表,得到页表起始地址;
- 第⼆次访问页表,得到物理页号;
- 第三次将物理页号与页内位移组合,得到物理地址。
可用软、硬件相结合的方法实现段页式地址变换,这样虽然增加了硬件成本和系统开销,但提高了内存的利用率。
(ps:参照小林大佬图片)