虚拟地址与物理地址

文章介绍了虚拟地址和物理地址的概念,以及它们如何通过MMU(内存管理单元)进行转换。分页模式被引入以优化内存管理,允许更有效地利用和保护内存空间。MMU的工作包括通过多级页表进行地址转换,并在转换失败时触发中断进行错误处理。

虚拟地址

        恰如其名,这个地址是虚拟的,与具体环境是解耦的,这样可以是程序员在编写程序时只需要关注代码逻辑本身,而不需要考虑地址分配。这些虚拟地址并不是真正运行在机器上的内存地址,每个程序的虚拟地址都是独立存在的,虚拟地址是逻辑上存在的一个数值。实际上我们在开发程序的过程中,软件程序经过编译后需要经过链接才能形成可执行程序,通过链接器将多个代码模块组装在一起,并解决模块之间的引用,即处理程序代码地址之间的引用问题,形成程序运行的静态内存空间视图。只不过这个地址是虚拟而统一的,而根据操作系统的不同,这个虚拟地址空间的定义也许不同,应用软件开发人员无需关心,由开发工具链给自动处理了。由于这虚拟地址是独立且统一的,所以各个公司开发的各个应用完全不用担心自己的内存空间被占用和改写。

物理地址

        顾名思义,就是真实存在的地址,物理地址在逻辑上也是一个数据,只不过这个数据会被地址译码器等电子器件变成电子信号,放在地址总线上,说明地址总线上的信号就代表了物理地址,地址总线电子信号的各种组合就可以选择到内存的储存单元,同时也可以选择其它设备的储存单元,如显卡中的显存、I/O 设备中的寄存器、网卡上的网络帧缓存器。

虚拟地址与物理地址相互转换

        通过上面的理解,我们知道,如果程序想要正常运行,必须将虚拟地址转换为物理地址,转换就需要一个转换结构或者转换函数,用软件的方式实现这个函数,效率比较低下,直接用硬件方式又不够灵活,于是就引入了软硬结合的方式——MMU(内存管理单元)。MMU 可以接受软件给出的地址对应关系数据,进行地址转换。

 

        上图中展示了 MMU 通过地址关系转换表,将 0x80000~0x84000 的虚拟地址空间转换成 0x10000~0x14000 的物理地址空间,而地址关系转换表本身则是放物理内存中的。

        如果将虚拟地址与物理地址一一对应,那么在实际开发过程中,我们会很快将物理地址给使用完,于是就引入了现代内存管理模式——分页模式,把虚拟地址空间和物理地址空间都分成同等大小的块,也称为页,按照虚拟页和物理页进行转换。根据软件配置不同,这个页的大小可以设置为 4KB、2MB、4MB、1GB

理解Linux系统中内核空间用户空间的虚拟地址物理地址映射关系,对于深入掌握操作系统内存管理进程隔离机制至关重要。首先,需要明确虚拟地址物理地址的概念。虚拟地址是操作系统为每个进程提供的一种逻辑地址,由CPU产生,经过内存管理单元(MMU)的转换变为物理地址,直接对应到物理内存条上的实际位置。而物理地址是直接指向硬件内存的地址。 参考资源链接:[Linux内核用户空间:虚拟地址物理地址映射解析](https://wenku.youkuaiyun.com/doc/69hvdofz9k?spm=1055.2569.3001.10343) 在Linux中,内核空间用户空间有着明确的区分,这不仅体现在虚拟地址空间的分配上,也关系到对应的物理内存映射。内核空间占据了高地址区域,其对应的物理地址是固定的,而用户空间占据了低地址区域,其对应的物理地址则会随着进程的分配释放而变化。 Linux采用的两级页表机制是实现这种映射的关键。每个进程都有自己的一套页表,用于将虚拟地址转换为物理地址。当用户空间的进程需要访问内核空间的服务时,系统通过系统调用进入内核态,此时进程的虚拟地址空间会切换到内核空间对应的虚拟地址,而内核页表确保了这些虚拟地址能够映射到正确的物理地址。 要查看内核空间用户空间的映射关系,可以使用`/proc/iomem`文件来查看物理地址设备使用的情况,或者使用`/proc/pid/maps`查看特定进程的内存映射情况。此外,理解内核源代码中关于虚拟地址映射的实现,如`include/asm-generic/pgtable.h`中的相关宏定义,可以帮助你更深入地掌握整个映射过程。 在实际应用中,开发者经常需要处理内存相关的复杂问题,比如页面错误、内存泄漏检测、性能优化等,这些都要求开发者对虚拟地址物理地址的映射机制有深刻的理解。阅读《Linux内核用户空间:虚拟地址物理地址映射解析》不仅可以帮助你建立理论基础,还可以通过案例分析加深对这些概念的理解。 参考资源链接:[Linux内核用户空间:虚拟地址物理地址映射解析](https://wenku.youkuaiyun.com/doc/69hvdofz9k?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值