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




  

相关话题

  Fedora 18如何通过Dr.com联网? 
  如何评价 360 安全卫士 for Linux? 
  为什么 Go 和 Rust 常提供静态编译好的 Linux 程序,而 C 不行? 
  Windows NT 内核与 Linux 内核相比哪个更安全? 
  Linux主机中增加一块内存条后,物理地址如何扩展? 
  一台用于学习linux的主机该如何配置、选购? 
  Windows 系统的硬件利用率是不是很差? 
  如何看待华为确认正自主研发手机操作系统? 
  开放原子开源基金会是什么,为什么华为把鸿蒙最核心的基础架构捐赠给这个机构? 
  程序在编译的时候,会转换成汇编,然后是机器指令,那么运行的时候,操作系统充当什么呢? 

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





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