+ -
当前位置:首页 → 问答吧 → 共享内存应该映射到高地址的(>2G),为什么我的结果不是这样?

共享内存应该映射到高地址的(>2G),为什么我的结果不是这样?

时间:2011-12-16

来源:互联网

Windows核心编程里面说,共享内存被映射到高地址,例如32位程序的地址空间,程序自己用的是0-2G虚拟地址,2G-4G是留给共享内存和共享dll使用的地址空间。

但是我写了个小程序测试了一下
C/C++ code

#include "stdafx.h"
#include<windows.h>
int main(void){
  HANDLE hFileMapping = CreateFileMapping( INVALID_HANDLE_VALUE,
                           NULL, PAGE_READWRITE, 0, 1024, "myshare" );
  LPVOID pvMapped = MapViewOfFile( hFileMapping, FILE_MAP_WRITE, 0, 0, 0 );
  LPTSTR pStr = static_cast<LPTSTR>( pvMapped );
  pStr[0]='a';
  pStr[1]='b';
  getchar();
  UnmapViewOfFile( pvMapped );
  CloseHandle( hFileMapping );
  return 0;
}


发现pvMapped的值是0x00370000,我用的vc2005。

大虾给个解释吧!

作者: absolutlyy   发布时间: 2011-12-16

程序自己用的是0-2G虚拟地址,2G-4G是留给共享内存和共享dll使用的地址空间
这句话不对,共享内存和共享dll也可以在0-2G,MapViewOfFile得到的永远都在0-2G

作者: Lactoferrin   发布时间: 2011-12-16

引用 1 楼 lactoferrin 的回复:

程序自己用的是0-2G虚拟地址,2G-4G是留给共享内存和共享dll使用的地址空间
这句话不对,共享内存和共享dll也可以在0-2G,MapViewOfFile得到的永远都在0-2G

书中写错?还是后来设计有变化?

作者: onlycs   发布时间: 2011-12-16

我不记得windows核心编程里面有这样的文字,楼主可能理解错了

作者: Lactoferrin   发布时间: 2011-12-16

0-2G是用户态程序可使用的空间,2-4G是内核使用的空间。也就是说ring3级的程序以及DLL等都是在0-2G的空间的

作者: bEst_02   发布时间: 2011-12-16

不错,能写程序观察下。我一直想看Windows核心编程,买不到英文版,就搁下了。

作者: hztj2005   发布时间: 2011-12-16

网上下,然后打印

作者: Lactoferrin   发布时间: 2011-12-16