【发布时间】:2012-02-12 02:48:39
【问题描述】:
当发生段错误时,这意味着我访问了未分配或未保护的内存。但是内核或CPU如何知道呢?它是由硬件实现的吗?哪些数据结构需要 CPU 查找?分配一组内存时,需要修改哪些数据结构?
【问题讨论】:
标签: memory memory-management operating-system kernel
当发生段错误时,这意味着我访问了未分配或未保护的内存。但是内核或CPU如何知道呢?它是由硬件实现的吗?哪些数据结构需要 CPU 查找?分配一组内存时,需要修改哪些数据结构?
【问题讨论】:
标签: memory memory-management operating-system kernel
详细信息会有所不同,具体取决于您所谈论的平台,但通常 MMU 会在您尝试无效内存访问时生成异常(中断),然后内核会将其作为中断服务例程的一部分进行处理.
【讨论】:
当进程尝试访问 CPU 无法物理寻址的内存时,通常会发生段错误。它是通知操作系统内存访问冲突的硬件。然后操作系统内核向导致异常的进程发送信号
【讨论】:
要回答您问题的第二部分,这同样取决于硬件和操作系统。在典型的系统(即 x86)中,CPU 查询段寄存器(通过全局或局部描述符表)以将段相对地址转换为虚拟地址(这通常,但不总是,现代 x86 操作上的无操作系统),然后(MMU 确实做到了这一点,但在 x86 上它是 CPU 的一部分)查阅页表以将该虚拟地址转换为物理地址。当它遇到一个未标记为存在的页面(当前位未在页面目录或表中设置)时,它会引发异常。当操作系统处理这个异常时,它要么放弃(当你犯错或恐慌时会产生 segfault 信号),要么它会修改页表以使内存有效并从异常中继续。通常,操作系统有一些簿记,说明哪些页面可能有效,以及如何获取页面。这就是需求分页的发生方式。
【讨论】:
这完全取决于特定的体系结构,但所有具有分页虚拟内存的体系结构的工作原理基本相同。内存中的数据结构描述了每个分配的内存页的虚拟到物理映射。对于每次内存访问,CPU/MMU 硬件都会查找这些表以找到映射。当然,这会非常慢,所以有硬件缓存可以加快速度。
【讨论】: