百科问答小站 logo
百科问答小站 font logo



操作系统虚拟地址转换为物理地址是如何避免冲突的? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

A1: 不会出现你描述的这种情况。多数情况下,A和B占用的地址可能是一样的,一个简单的Windows程序,大部分起始地址都是0x40000这类低地址,虚地址跟物理地址不是一一对应的关系,所以即使A/B进程的代码段的虚地址相同,物理地址也是不同的,不存在冲突的问题。

并且实际上一个进程占用的内存空间远远没有你说的那么大,Windows在32位环境下用户进程可用的地址空间只有2~3GB,都集中在低地址范围,并且在用户地址空间范围内,大部分都被共享库(DLL)占用了。

以上是用户地址空间,对于内核地址空间来说,其范围、内容、页表都是固定的,所以内核能看到所有进程的页表,自然也就能管理所有进程的内存映射,可以保证不冲突。

另外,不同进程的虚地址可能对应着同一块物理地址,映射是可以重复存在的,典型的例子就是我说的共享库,操作系统为了节约物理内存使用,对于同一个DLL,在不同的进程中,其虚地址可能是不同的,但其对应的物理内存可能是同一块。

Q2: 一般情况下,页表项的数量是一样的,32位情况下页表不会有多大,只不过不是所有项目都是有效的,一次性申请好页表项的内存可以降低管理的复杂度。实际情况要看操作系统的行为,不同操作系统的行为是不同的。

对于多级页表,操作系统有可能只申请某些有效的页表项,在顶级(PDE)页目录表上把不需要映射的部分置成无效的状态。根据A1回答里我提到的:内核地址空间的内容是一样的,所以页表项里有一半到四分之一的内容是固定的,不同进程不需要重复申请页表内存。

Q3: 不是删除页表项,而是把页表项设置成无效的状态,页表项(32位的4字节或者8字节PTE)只要把P位(最低位)清零就可以了




  

相关话题

  为什么 Android 要采用 Binder 作为 IPC 机制? 
  Windows 内核和 Linux 内核谁更复杂? 
  如何评价Linux 内核核心成员Theodore Ts'o被 Sage Sharp 指控为强奸辩护者? 
  有无可能基于某一版安卓,独立于谷歌开发升级系统,经过几代迭代后,最终和安卓发展成两个相对独立的系统? 
  如果 Windows 10 是微软最后一代系统,Win 10 以前的系统全部消失要多久? 
  WIN7网络连接成功后,有个白框一闪而过,这方面的大神能帮忙看看,给个原因或可能有效的探索方向么? 
  深度学习底层开发对数学有哪些要求? 
  Unix网络编程里的阻塞是在操作系统的内核态创建一个线程来死循环吗? 
  为什么计算机采用补码而不是原码或反码? 
  CentOS软件那么老为什么大家还要用它? 

前一个讨论
内存(DRAM)的连续读写速度和随机读写速度是一样的吗?
下一个讨论
能否将数个usb4接口并联在一起,达到pci3.0 x8甚至x16的带宽,减少外接显卡无损耗?





© 2025-06-05 - tinynew.org. All Rights Reserved.
© 2025-06-05 - tinynew.org. 保留所有权利