虚拟地址与物理地址

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虚拟地址

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

物理地址

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

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

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

 

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

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

Linux系统中,内存被划分为内核空间用户空间,两者之间通过虚拟地址物理地址映射来保证隔离性效率。用户空间从0x***到0xBFFFFFFF,而内核空间从0xC0000000到0xFFFFFFFF。要理解这两者之间的映射关系,首先要了解虚拟地址是进程在内存中的逻辑地址,而物理地址是硬件上实际的物理内存位置。在内核空间,虚拟地址物理地址通过线性映射实现,其中常量PAGE_OFFSET定义了这两者之间的偏移量,通常是0xC0000000,这意味着内核空间的每个虚拟地址都可以通过加上这个偏移量转换为对应的物理地址。例如,内核空间中的虚拟地址0xC0000000对应于物理地址0x***。这种映射方式简化了内存管理,因为它创建了从虚拟地址空间到物理地址空间的一对一映射。在用户空间,每个进程拥有自己独立的虚拟地址空间,但其地址映射依赖于操作系统提供的分页机制。为了深入理解这一过程,建议参考《Linux内核用户空间:虚拟地址物理地址映射解析》这份资料。该资料详细介绍了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、付费专栏及课程。

余额充值