【问题标题】:How does the kernel know about segment fault?内核如何知道段错误?
【发布时间】:2012-02-12 02:48:39
【问题描述】:

当发生段错误时,这意味着我访问了未分配或未保护的内存。但是内核或CPU如何知道呢?它是由硬件实现的吗?哪些数据结构需要 CPU 查找?分配一组内存时,需要修改哪些数据结构?

【问题讨论】:

    标签: memory memory-management operating-system kernel


    【解决方案1】:

    详细信息会有所不同,具体取决于您所谈论的平台,但通常 MMU 会在您尝试无效内存访问时生成异常(中断),然后内核会将其作为中断服务例程的一部分进行处理.

    【讨论】:

    • “无效内存访问”可能由于多种原因而无效,例如尝试写入只读内存,尝试在不可执行内存中执行代码,尝试读取或写入未分配关联页面的地址,等等。
    【解决方案2】:

    当进程尝试访问 CPU 无法物理寻址的内存时,通常会发生段错误。它是通知操作系统内存访问冲突的硬件。然后操作系统内核向导致异常的进程发送信号

    【讨论】:

      【解决方案3】:

      要回答您问题的第二部分,这同样取决于硬件和操作系统。在典型的系统(即 x86)中,CPU 查询段寄存器(通过全局或局部描述符表)以将段相对地址转换为虚拟地址(这通常,但不总是,现代 x86 操作上的无操作系统),然后(MMU 确实做到了这一点,但在 x86 上它是 CPU 的一部分)查阅页表以将该虚拟地址转换为物理地址。当它遇到一个未标记为存在的页面(当前位未在页面目录或表中设置)时,它会引发异常。当操作系统处理这个异常时,它要么放弃(当你犯错或恐慌时会产生 segfault 信号),要么它会修改页表以使内存有效并从异常中继续。通常,操作系统有一些簿记,说明哪些页面可能有效,以及如何获取页面。这就是需求分页的发生方式。

      【讨论】:

      • 对不起,我应该澄清一下。我将更新我的答案,但在这种情况下,我的意思是“页表中未标记的内存”。当 CPU 试图将虚拟地址转换为物理地址时,它会检查页表中的当前位(页表有很多层),如果发现该页不存在,则会引发异常(页错误在 x86 上)。操作系统可以通过它选择的任何方式使内存存在,然后恢复执行,或者它可以做其他事情,比如转储核心。
      【解决方案4】:

      这完全取决于特定的体系结构,但所有具有分页虚拟内存的体系结构的工作原理基本相同。内存中的数据结构描述了每个分配的内存页的虚拟到物理映射。对于每次内存访问,CPU/MMU 硬件都会查找这些表以找到映射。当然,这会非常慢,所以有硬件缓存可以加快速度。

      【讨论】:

        猜你喜欢
        • 2019-09-03
        • 2013-10-31
        • 2016-05-25
        • 2015-05-23
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多