为什么64kb禁入区要64kb??

toyasimple 2009-07-13 12:55:21
看windows程序内存的使用。说通常被分四个区
其中NULL指针分区,跟禁入区都为64kb,
我想问问,是否一定要64kb, 64kb是不是实现起来有好处?(64kb是16位,这我知道)。
但如果要特殊值,为什么不用4k, 一个页面大小也是特殊的啊?

另外这NULL指针分区,跟禁入区,在用户模式访问不了。那在内核模式可以访问吗?(我猜想也访问不了,但想确认一下)
另外NULL指针分区跟禁入区,为什么不放在一起,要放两个地方?是不是为了兼容?
...全文
386 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
everhaitao2 2010-01-15
  • 打赏
  • 举报
回复
为什么4kB 分页机制最后的12位偏移地址 决定了页是4KB

为什么64KB 因为分配粒度目前暂定 64KB 为了保持兼容。所以null和禁入区是最小64KB。分配粒度64KB是为了考虑以后cpu发展到64KB页面大小的时候可以和现在的程序兼容。

cpu特权级可以访问null和禁入。不放一起是功能不同,一个是捕获指针用 一个是分开分区用。
hxfjb 2010-01-15
  • 打赏
  • 举报
回复
估计是为了兼容,以前是这么做的,现在也就这么做了。
不过内存都是虚拟内存,在逻辑上做了划分,通常在应用中,*(LPVOID)0 = 100是会报错的,
不过只要你合适地调用ntdll中的函数,可以做到*(LPVOID)0 = 100是正确的。
toyasimple 2009-07-13
  • 打赏
  • 举报
回复
《windows核心编程》第三部分都是讲内存管理的。第13章windows内存结构就讲到这样的分区。
开始问问题的时候,我没有考虑到分配粒度,多谢一楼提醒。

书中也说到,“但是,截止到撰写本书时,所有的C P U平台(x 8 6、3 2位A l p h a、6 4位A l p h a和I A - 6 4)都使用6 4 K B这个相同的分配粒度”。

但是,为什么要用64k呢? 按道理,页面通常为4k或者8k, 那分配粒度为什么不设置为跟页面大小一样呢?我隐约觉得跟64k是2的16次方有关系。但从硬件或者软件设计的角度来说,64k有什么好处啊? 是不是这样就可以用另16位就可以表示不同的分配啊??
biweilun 2009-07-13
  • 打赏
  • 举报
回复
LZ的关于windows程序内存的解释是哪里看来的?愿闻其详
chehw 2009-07-13
  • 打赏
  • 举报
回复
win32下GetSystemInfo获取的SYSTEM_INFO中的dwAllocationGranularity(内存分配粒度)通常为64K

VirtualAlloc分配内存时起始地址会根据AllocationGranularity而取整.

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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