导航:首页 > 编程系统 > linux中的物理地址和虚拟地址

linux中的物理地址和虚拟地址

发布时间:2025-01-11 14:16:29

linux 虚拟地址,到底怎么理解

不是仅仅 Linux 是这么设计的,整个现代流行的操作系统都是这么设计的。
应用程序被读入内存后,为了保证系统的统一性,所有的程序都有同样的一套寻址规范。这个寻址就是虚拟地址。这个虚拟地址是系统提供转换的,不是程序的工作。

如果系统不提供这个功能,那么应用程序就需要自己去寻找没有被使用的内存,以及还要自己去处理内存容量的问题,而且如果程序调用外部的一些函数库,这些函数库也需要分配内存,这会导致应用程序的设计难度非常大,每个应用程序实际上就是一个操作系统了。多个程序共同运行导致内存使用混乱也很容易出现。
应用程序申请内存,使用的是操作系统的内存分配功能。这样操作系统可以根据实际情况给应用程序内存,程序不需要考虑因为内存位置不同而必须不同编写的难度。而且操作系统还可以提供虚拟内存等等各种方式来扩充内存,这样的内存对于应用程序来说是不需要考虑的,一切都有系统打理。

使用虚拟地址后,对于应用程序来说,他的内存使用不需要考虑其他的程序占用,也不需要考虑内存容量的问题,也不需要考虑内存块位置,函数库的调用也都扔给操作系统打理。这使得应用程序不需要考虑具体如何管理内存,只需要考虑作为应用程序的应用部分。

而且,因为内存是虚拟的,应用程序一些函数调用,操作系统可以把多个应用程序的调用都用同一套数据来处理,这样,既可以节约内存使用(就是启动100个应用程序,也只需要内存里有一套函数库而已),也可以做到外部函数库和应用程序没有直接关联,纯粹是由系统做虚拟地址过渡。

至于为什么 4G ,这是传统+一些兼容的考虑。
以前没有这个技术时,每个程序都可以完全使用整个系统,整个空间是连续的。到了这种虚拟地址的方式后,每个程序还是有自己“独立”的一整套内存地址。但每个程序内存使用量肯定不一样。那么多少内存空间才完全够用呢?当时因为正好使用了 32 位系统。那么就把整个 32 位环境支持的 4G 内存容量作为这个极限。
不过因为内存地址是虚拟的。实际应用程序要用内存,是需要先申请的,所以只有程序申请后,真实内存才会被占用。这个 4G 只是在算法上作为极限。

不过因为 4G 也是硬件极限。所以 4G 以外的地址都是不能使用的,这就导致另一个问题,一些硬件有存储器,有些硬件需要存储空间做交互(比如 PCI ,比如各种硬件,比如 AGP 显卡)。这些存储区域怎么处理?
所以,Windows Vista 的 32 位版在 4G 内存的机器上曾经报出只有 3.5G (有的机器甚至只有 3.25G 可以用)。就是这个问题的解决办法导致的:把硬件的内存用虚拟地址的方式,放到虚拟地址的最后面。这样应用程序调用硬件存储时,可以直接按照内存的方式读写。这样应用程序就很好的统一了存储界面:只有 4G 的内存范围,不存在其他方式的存储调用方式(硬盘需要用读写功能读取到内存后才能处理,而不是直接进行处理)。这样应用程序的开发就很简单,而且整个内存的使用每个程序都一样。不存在各种硬件的原因而不同导致的需要重新设计内存管理算法。操作系统也能根据实际应用程序的需要随时分配数据,也可以根据每个程序的运行情况,区别的提供物理内存或者虚拟的内存。

这么设计最大的一个好处是,硬件环境和应用程序是无关的,中间由操作系统做转换。而且应用程序互相之间也没有影响,就好象整个内存都由他自己一个程序使用一样。

PS:说了半天,我发现我自己也说不清楚其中的缘由……

② “线性地址,逻辑地址,虚拟地址,物理地址”分别是什么意思

逻辑地址(Logical Address) 是指由程式产生的和段相关的偏移地址部分。例如,你在进行C语言指针编程中,能读取指针变量本身值(&操作),实际上这个值就是逻辑地址,他是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);

逻辑也就是在Intel保护模式下程式执行代码段限长内的偏移地址(假定代码段、数据段如果完全相同)。应用程式员仅需和逻辑地址打交道,而分段和分页机制对你来说是完全透明的,仅由系统编程人员涉及。应用程式员虽然自己能直接操作内存,那也只能在操作系统给你分配的内存段操作。

③ Linux 的虚拟内存管理有几个关键概念

Linux 的虚拟内存管理有几个关键概念:
1、每个进程都有独立的虚拟地址版空间,进程访问权的虚拟地址并不是真正的物理地址;
2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址;
3、如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。

④ linux内存虚拟化(内存地址转换)

Linux内存虚拟化的核心在于内存地址转换,它在操作系统复杂的内存管理中发挥关键作用。虚拟内存不仅扩展了进程可用的”内存空间“,还为每个进程提供了私有的、隔离的地址空间。在虚拟机环境中,对虚拟内存的处理涉及到虚拟化技术,区别于操作系统自身的内存管理。

Linux中的地址转换通常涉及虚拟地址通过MMU(内存管理单元)和页表映射为物理地址。MMU是处理器中的硬件组件,由TLB(快表)和table walk unit组成。TLB作为页表的高速缓存,能快速查找虚拟地址与物理地址的对应关系,显著提高寻址性能。table walk unit则负责根据页表信息进行多次物理内存访问,实现地址转换。

页表是进程独有的,存储在主存中。访问页表耗时,因此设计了TLB进行加速。当TLB未命中时,需通过table walk unit在软件层面查找页表,这是CISC架构处理器的处理方式。相反,RISC架构如Alpha则采用软件TLB miss handling,灵活性更高。对于虚拟机中的地址转换,如运行在虚拟机上的Linux,需要经过VMM的两次转换,与传统IA32架构一次转换有所不同。

为了支持虚拟地址的两次转换,软件层面引入了影子页表。然而,这种纯软件方法的开销较大,为此,硬件辅助的内存虚拟化技术如Intel的EPT和AMD的NPT应运而生,它们能直接支持GPA到HPA的转换。EPT/NPT MMU通过查找gPT和nPT页表,实现了内存虚拟化的高效处理,减少了内存开销和CPU负担。

优化EPT/NPT MMU时,关键在于增大TLB容量、减少页表级别,以减少内存访问次数。总的来说,虚拟内存地址转换的核心机制与虚拟内存本身紧密相关,理解和掌握这一过程对于深入理解操作系统内存管理至关重要。

阅读全文

与linux中的物理地址和虚拟地址相关的资料

热点内容
javafrom提交地址参数 浏览:721
git发布版本 浏览:728
vc修改文件名 浏览:149
linux65从域 浏览:321
用什么东西压缩文件 浏览:406
怎么删除ipad隐藏的APP 浏览:981
编程如何占用大量内存 浏览:116
多个excel表格文件如何组合 浏览:918
ubuntu内核升级命令 浏览:679
pgp文件夹 浏览:894
一键还原的文件是什么格式 浏览:581
女汉子微信名霸气十足 浏览:65
win10手机蓝屏修复 浏览:419
windows2008激活工具 浏览:259
g71的编程应注意什么 浏览:572
文件路径不符合是什么意思 浏览:543
qq如何换绑微信绑定 浏览:67
文件包下载的安装包在哪里 浏览:811
90版本升级不送 浏览:186
工具箱英文 浏览:382

友情链接