Windows虚拟地址相关笔记

Windows虚拟地址空间

32位 虚拟空间最大为4GB,默认为:
2GB用户进程空间(低位0x00000000-0x7FFFFFFF)
2GB系统空间(高位0x80000000-0xFFFFFFFF)

处理器存取模式划分为用户模式Ring3和内核模式Ring0
用户应用程序一般在用户模式,访问空间局限于用户区。
操作系统内核代码运行在内核模式,可以访问所有内存空间,可使用所有处理器指令。

用户区内存为每个进程真正独立的可用内存空间,进程中应用程序代码、全局变量、所有线程的线程栈以及加载的DLL代码等。
每个进程的用户区的虚拟内存空间相互独立,一般不可以直接跨进程访问。

内核区中的数据为所有进程共享的,包括操作系统内核代码、线程调度、内存管理、文件系统支持、网络支持、驱动程序等。其内代码数据被操作系统保护,用户模式的代码无法直接访问和操作,否则汇地址访问违规。

虚拟地址空间和物理地址空间联系

x86 Windows默认使用二级页表将虚拟地址转译为物理地址。
一个32位地址: 10位页目录索引,10位页表索引,12位字节索引
通过CR3寄存器获得页目录基地址。

对于一个要转换成物理地址的虚拟地址,CPU首先根据CR3中的值,找到页目录所在的物理页。然后根据虚拟地址的第22位到第31位这10位(最高的10bit)的值作为索引,找到相应的页目录项(PDE,page directory entry),页目录项中有这个虚拟地址所对应页表的物理地址。有了页表的物理地址,根据虚拟地址的第12位到第21位这10位的值作为索引,找到该页表中相应的页表项(PTE,page table entry),页表项中就有这个虚拟地址所对应物理页的物理地址。最后用虚拟地址的最低12位,也就是页内偏移,加上这个物理页的物理地址,就得到了该虚拟地址所对应的物理地址。

注意,并不是所有的“程序”都是运行在虚拟地址中。CPU在启动的时候是运行在实模式的,Bootloader以及内核在初始化页表之前并不使用虚拟地址,而是直接使用物理地址的。

不同的进程可以有相同的虚拟地址,每个进程可以有不同的映射。两次运行同一个程序就是使用的相同的虚拟地址,但是映射到的物理地址却是不一样的。
虚拟地址可以相同,映射到不同的物理地址。另外注意若未说同时,即不同时刻的进程可能使用同一物理地址。

应用程序的指针访问的是虚拟地址,所以两个不同的进程,可以访问相同的地址,但是每个进程的这个虚拟地址,被操作系统放在不同的物理地址上,互相没有任何关系。
如果你希望两个进程共享内存,必须调用特定的操作系统函数,获取一个映射的页面(windows下叫做内存映射页),此时多个进程才能访问相同的物理地址的数据,并且共享数据。

2020.3.14 22:03 Jarvis

参考:
百度百科 虚拟地址
csdn ask

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值