加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 电商 > 正文

windows – 关于进程’地址空间中的NULL指针分配分区的问题

发布时间:2021-01-25 05:04:43 所属栏目:电商 来源:网络整理
导读:我在读 Windows C/C++第5版以下是一些报价: Each process’ virtual address space is split into partitions. On x86 32-Bit Windows,the partition of 0x00000000 – 0x0000FFFF (inclusive) is called NULL-Pointer Assignment Partition. This partitio

我在读< Windows C/C++第5版>以下是一些报价:

Each process’ virtual address space is
split into partitions. On x86 32-Bit
Windows,the partition of 0x00000000 –
0x0000FFFF (inclusive) is called
NULL-Pointer Assignment Partition.
This partition is set aside to help
programmers catch NULL-pointer
assignments. If a thread in your
aprocess attempts to read from or
write to a memory address in this
partition,an access violoation is
raised.

我想知道,为什么我们必须使用一系列的地址空间而不只是值0才能捕获NULL指针分配? AFAIK,NULL等于0.那么这个设计背后的考虑是什么?用户不应该触摸此范围内的其他内容吗?或者NULL不一定等于0?

非常感谢.

解决方法

所有现代操作系统都巧妙地使用虚拟内存管理硬件实现空指针解除引用检查,而无需执行开销.设置第0个4 KB页面(或者在这种情况下,第0-15页(总共64 KB)),因此任何数据读取或写入或地址0(或0x00000FFF或0x0000FFFF)的指令执行都会立即导致访问违规例外.

让我用不同的方式.将空指针解引用陷阱为0,但允许对(例如)地址1的数据引用将非常昂贵 – 因为您无法使用页面粒度VM硬件,所以有必要执行空指针比较和分支序列在很多指针解引之前.通过使第一页或前几页不可访问,可以在VM硬件中“免费”完成此检查.缺点是你不能将这些第一页用于其他任何事情.

(理论上,然后可以使用足够优化的编译器来确定哪些指针解引用可能不是空指针解引用,但是在出现这种聪明的编译器之前,未映射的0页面技巧将不得不这样做.)

那么为什么Windows(post Win98)空指针赋值分区为64 KB而不是最小必需的4 KB呢? Wyzard的答案也是捕获空指针数组索引错误的好例子.

*延迟更新:RE:为什么64 KB? – 我问了一个应该知道Windows Core团队的人,他们说这可能是一个64 KB的区域,因为Windows将某些内存管理结构保持在64 KB的分配粒度.这是为什么?我不知道,但也许Raymond Chen有答案:http://blogs.msdn.com/b/oldnewthing/archive/2003/10/03/55239.aspx.哇. *

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读