百科问答小站 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位(最低位)清零就可以了




  

相关话题

  内存(DRAM)的连续读写速度和随机读写速度是一样的吗? 
  都说 Linux 稳定,为什么Ubuntu 会崩呢? 
  为什么显卡在内存中的映射是0b8000H? 
  为什么GCC的版本号增速比以前快这么多? 
  进程被操作系统加载之后,磁盘上的二进制文件可以删掉吗?如果删掉对正在运行的进程有什么影响吗? 
  请问如果这样设计笔记本,能不能统一办公本 和 游戏本? 
  如何评价鸿蒙系统在 Github 上正式发布开源? 
  如何解决Linux下信号产生的死锁? 
  RT-thread和鸿蒙系统是一种类型的系统吗? 
  页表放在主存中,那么页表基址寄存器中存放的页表基址是虚拟基址还是主存中页表实际基址? 

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





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