内核如何给出seg.像这样的场景的错误?

bal*_*486 1 linux segmentation-fault

我对访问一些无效数据有疑问.操作系统如何导致这样的场景出现分段错误:

假设一块数据长100字节,在4K页面的开头对齐.如果我们访问页面的前100个字节内的有效数据,这将把页面加载到内存中,并将页面表项置于TLB中.如果我们现在尝试访问100和4K之间的一些无效数据,因为条目已经存在于页表中,我们是否可以访问无效数据?

Dea*_*ing 5

那是对的.但通常你不是直接从操作中分配内存.您通常通过某些库函数(newmalloc等)分配它.库函数将占用4KB(通常它在一个块中分配超过4KB)并将其拆分为您要求的实际块.因此,通常当您要求100字节的内存时,100个字节将被"楔入"在您所做的其他两个分配请求之间.

这就是为什么当您从数组末尾访问数据时它是"未定义的行为":您可能会遇到分段错误,您可能会丢弃恰好存储在那里的其他变量,或者您可能没问题且它确实有效(对于至少一段时间).