Memory 内核如何知道段错误?

Memory 内核如何知道段错误?,memory,memory-management,operating-system,kernel,Memory,Memory Management,Operating System,Kernel,当出现段故障时,这意味着我访问了未分配或未受保护的内存。但是内核或CPU是如何知道的呢?它是由硬件实现的吗?CPU需要查找哪些数据结构?分配一组内存时,需要修改哪些数据结构?详细信息会有所不同,具体取决于您所说的平台,但通常MMU会生成异常(中断)当您尝试无效的内存访问时,内核会将其作为中断服务例程的一部分进行处理。详细信息会有所不同,具体取决于您所说的平台,但通常MMU会生成异常(中断)当您尝试无效的内存访问时,内核会将其作为中断服务例程的一部分进行处理。当进程尝试访问CPU无法物理寻址的内存

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

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

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

当进程尝试访问CPU无法物理寻址的内存时,通常会发生seg故障。是硬件通知操作系统内存访问冲突。然后,操作系统内核向导致异常的进程发送信号。当进程试图访问CPU无法物理寻址的内存时,通常会发生seg故障。是硬件通知操作系统内存访问冲突。然后,操作系统内核向进程发送一个信号,导致异常回答问题的第二部分,这同样取决于硬件和操作系统。在典型系统(即x86)中,CPU参考段寄存器(通过全局或本地描述符表)将段相对地址转换为虚拟地址(在现代x86操作系统上通常是,但并不总是,无操作),然后(MMU确实执行此位,但在x86上是CPU的一部分)查阅页表以将该虚拟地址转换为物理地址。当它遇到未标记为“存在”的页面(页面目录或表中未设置“存在”位)时,会引发异常。当操作系统处理此异常时,它要么放弃(当您出错或死机时,会产生segfault信号),要么修改页表以使内存有效并从异常继续。通常,操作系统会有一些簿记,说明哪些页面是有效的,以及如何获取页面。这就是请求分页的发生方式。

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

这完全取决于特定的体系结构,但所有具有分页虚拟内存的体系结构在本质上都是相同的。内存中有一些数据结构,描述每个分配内存页的虚拟到物理映射。对于每次内存访问,CPU/MMU硬件都会查找这些表以查找映射。当然,这将非常缓慢,因此有硬件缓存来加速它。

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

由于以下几个原因,“无效内存访问”可能无效,例如尝试写入只读内存、尝试在非可执行内存中执行代码、尝试读取或写入未分配相关页的地址等。“无效内存访问”可能因多种原因而无效,例如尝试写入只读内存、尝试在非可执行内存中执行代码、尝试读取或写入未分配关联页的地址等。对不起,我应该对此进行澄清。我将更新我的答案,但在本文中我的意思是“页面表中未标记的内存”。当CPU尝试将虚拟地址转换为物理地址时,它会检查页表中的当前位(页表有许多层),如果发现页不存在,则会引发异常(x86上的页错误)。操作系统可以通过选择任何方式使内存存在,然后恢复执行,或者它可以做其他事情,比如转储内核。对不起,我应该澄清一下。我将更新我的答案,但在本文中我的意思是“页面表中未标记的内存”。当CPU尝试将虚拟地址转换为物理地址时,它会检查页表中的当前位(页表有许多层),如果发现页不存在,则会引发异常(x86上的页错误)。操作系统可以通过选择任何方式使内存存在,然后恢复执行,或者可以执行其他操作,如转储内核。