为什么2G内核空间的windows最多可以使用64G的RAM?

zht_304 2010-06-01 02:37:04

“Note that all the code and data required by the kernel is squeezed tightly into a 2-GB partition. So reducing the kernel address space to less than 2 GB restricts the number of threads, stacks, and other resources that the system can create. In addition, the system can use a maximum of only 64 GB of RAM, unlike the 128-GB maximum available when the default of 2 GB is used. ”

这个64G, 128G 从哪得出来的?

...全文
245 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
sbdt123 2010-06-02
  • 打赏
  • 举报
回复
真是学习了啊
zht_304 2010-06-02
  • 打赏
  • 举报
回复
题目写错了。 128G。
正在看书。以后有能力研习下你的代码。
  • 打赏
  • 举报
回复
看看汇编关于地址总线数据总线那一块就知道啦...
zht_304 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mydo 的回复:]
2G的内核指的是虚拟地址空间,而64G指的是物理地址空间。

这是因为intel的32位系统启用了PAE机制后,页表(PTE)宽度加宽,从而使得

内核访问物理空间的范围增加。

原来使用20位表示page的index,这样 2^20 * 2^12 = 2^32 = 4GB物理内存空间

而PAE下系统用25位表示page的index,这样 2^25 + 2^12 = 2^37 =……
[/Quote]

谢谢, 大牛!
fthislife 2010-06-02
  • 打赏
  • 举报
回复
mark
东莞某某某 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mydo 的回复:]
2G的内核指的是虚拟地址空间,而64G指的是物理地址空间。

这是因为intel的32位系统启用了PAE机制后,页表(PTE)宽度加宽,从而使得

内核访问物理空间的范围增加。

原来使用20位表示page的index,这样 2^20 * 2^12 = 2^32 = 4GB物理内存空间

而PAE下系统用25位表示page的index,这样 2^25 + 2^12 = 2^37 =……
[/Quote]


mydo威武
大熊猫侯佩 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mydo 的回复:]

原来使用20位表示page的index,这样 2^20 * 2^12 = 2^32 = 4GB物理内存空间

而PAE下系统用25位表示page的index,这样 2^25 + 2^12 = 2^37 ……
[/Quote]

一时粗心打错字了,勘误:
而PAE下系统用25位表示page的index,这样 2^25 * 2^12 = 2^37
icansaymyabc 2010-06-01
  • 打赏
  • 举报
回复
5楼正解
lzh3ng 2010-06-01
  • 打赏
  • 举报
回复
路过。。。。。。
mymtom 2010-06-01
  • 打赏
  • 举报
回复
MARK
vanchristin 2010-06-01
  • 打赏
  • 举报
回复
这个一定要mark
cattycat 2010-06-01
  • 打赏
  • 举报
回复
哇,高手mydo。
pengzhixi 2010-06-01
  • 打赏
  • 举报
回复
mark先
大熊猫侯佩 2010-06-01
  • 打赏
  • 举报
回复
mmguy是我编写的检查NT系统进程的虚拟和物理内存的工具,充分考虑了PAE的特征,可以
在2k/xp/2k3/vista/windows 7 下运行。


//比较复杂分几种情况:
//若开PAE,且HyGetPDE失败,则返回2MB;(表示该PDE对应的512个PTE皆未分配物理空间。)
//若开PAE,且HyGetPDE成功,则若是LargePage则同样返回2MB,否则返回4KB;
//若关PAE,且HyGetPDE失败,则返回4MB;(表示该PDE对应的1024个PTE皆未分配物理空间。)
//若关PAE,且HyGetPDE成功,则若是LargePage则同样返回4MB,否则返回4KB;
size_t DDKAPI HyGetAddrPageSize(PVOID addr)
{
size_t dwRet;
PDE pde;
PVOID PdeAddr;

if(HyIsOpenPAE())
dwRet = (PAGE_SIZE/2) * 1024; //2MB
else
dwRet = PAGE_SIZE * 1024; //4MB

if(!HyGetPDE(addr,&pde,&PdeAddr))
goto QUIT;
else
{
if(!HyIsLargePage(pde))
dwRet = PAGE_SIZE;
}
QUIT:
return dwRet;
大熊猫侯佩 2010-06-01
  • 打赏
  • 举报
回复
部分相关源代码节选:


//*PdeAddr = *pPde ,分为是否开PAE两种情况。
//函数成功返回true,否则返回false。
//调用该函数前先自行备份原PdeAddr处的PDE。
static bool DDKAPI HySetPDE(IN PVOID PdeAddr,IN PPDE pPde)
{
bool bRet = false;
if(!PdeAddr || !pPde)
goto QUIT;

if(!MmIsAddressValid(PdeAddr))
{
#if defined(GOTO_DEBUG)
DbgPrint("[%s]PdeAddr %08p Invalid!!!\n",__func__,PdeAddr);
#endif

goto QUIT;
}

__try
{
if(HyIsOpenPAE())
*(ULONGLONG*)PdeAddr = pPde->PAEVal;
else
*(DWORD*)PdeAddr = pPde->Val;
bRet = true;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
#if defined(GOTO_DEBUG)
DbgPrint("%s's try block rise a Except!\n",__func__);
#endif
}
QUIT:
return bRet;
}

//*PdeAddr = *pPte ,分为是否开PAE两种情况。
//函数成功返回true,否则返回false。
//调用该函数前先自行备份原PdeAddr处的PTE。
static bool DDKAPI HySetPTE(IN PVOID PteAddr,IN PPTE pPte)
{
bool bRet = false;
if(!PteAddr || !pPte)
goto QUIT;

if(!MmIsAddressValid(PteAddr))
{
#if defined(GOTO_DEBUG)
DbgPrint("[%s]PdeAddr %08p Invalid!!!\n",__func__,PteAddr);
#endif

goto QUIT;
}

__try
{
if(HyIsOpenPAE())
*(ULONGLONG*)PteAddr = pPte->PAEVal;
else
*(DWORD*)PteAddr = pPte->Val;
bRet = true;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
#if defined(GOTO_DEBUG)
DbgPrint("%s's try block rise a Except!\n",__func__);
#endif
}
QUIT:
return bRet;
}

大熊猫侯佩 2010-06-01
  • 打赏
  • 举报
回复
2G的内核指的是虚拟地址空间,而64G指的是物理地址空间。

这是因为intel的32位系统启用了PAE机制后,页表(PTE)宽度加宽,从而使得

内核访问物理空间的范围增加。

原来使用20位表示page的index,这样 2^20 * 2^12 = 2^32 = 4GB物理内存空间

而PAE下系统用25位表示page的index,这样 2^25 + 2^12 = 2^37 = 128GB物理空间

NT下的内存管理与监控,可以看我blog的mmguy程序:

link : http://blog.csdn.net/mydo/archive/2010/01/09/5166255.aspx
赵4老师 2010-06-01
  • 打赏
  • 举报
回复
想访问大于64G的对象可以用文件模拟,理论上只受硬盘空间限制(1TB?)
_open
_lseeki64
_write
_read
_close
cattycat 2010-06-01
  • 打赏
  • 举报
回复
64位的话应该很容易,32位好像可以用地址窗口扩展访问。
taodm 2010-06-01
  • 打赏
  • 举报
回复
楼主得自己去查查p4 cpu的地址总线有多宽了。
liutengfeigo 2010-06-01
  • 打赏
  • 举报
回复

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧