程序如何知道是否允许内存访问?

How do programs know if a memory access is allowed?

维基百科是这样解释“分段错误”的:

A segmentation fault occurs when a program attempts to access a memory location that it is not allowed to access, or attempts to access a memory location in a way that is not allowed (for example, attempting to write to a read-only location, or to overwrite part of the operating system).

那么,程序执行者在运行时知道程序试图访问的内存是否实际上被允许访问的机制是什么?

简短的回答是您的程序使用的地址(以及进程 运行 您的程序使用的地址)不是“真实”的内存地址。相反,在您和由虚拟内存和分页提供的物理内存地址之间存在一个抽象层。

此外,您的程序被分成具有不同目的的“段”,它们通常位于不同的页面上。例如,为单个函数调用分配的局部变量位于堆栈上,而通过 'malloc' 获得的内存驻留在堆上。