当发生段故障时,这意味着我访问未分配或保护的内存。但内核或CPU如何知道它?它是由硬件实现的吗? CPU需要查找哪些数据结构?分配一组内存时,需要修改哪些数据结构?
答案 0 :(得分:2)
细节会有所不同,具体取决于您所讨论的平台,但通常MMU会在您尝试无效的内存访问时生成异常(中断),然后内核会将此作为中断服务程序的一部分处理
答案 1 :(得分:1)
当进程尝试访问CPU无法物理寻址的内存时,通常会发生seg错误。硬件通知操作系统有关内存访问冲突的信息。然后,OS内核向进程发送一个导致异常的信号
答案 2 :(得分:1)
要回答问题的第二部分,它又取决于硬件和操作系统。在典型的系统(即x86)中,CPU查询段寄存器(通过全局或本地描述符表)将段相对地址转换为虚拟地址(这通常是但不总是现代x86操作上的无操作系统),然后(MMU真的这么做,但在x86上它的部分CPU)查询页表以将该虚拟地址转换为物理地址。当遇到未标记为存在的页面(当前位未在页面目录或表中设置)时,它会引发异常。当操作系统处理此异常时,它将放弃(产生您在出错或恐慌时看到的段错误信号),或者它将修改页表以使内存有效并从异常继续。通常,操作系统会有一些簿记,说明哪些页面可能有效,以及如何获取页面。这就是请求分页的发生方式。
答案 3 :(得分:0)
这完全取决于特定的体系结构,但所有具有分页虚拟内存的体系结构都基本相同。内存中有数据结构描述每个分配的内存页面的虚拟到物理映射。对于每次内存访问,CPU / MMU硬件都会查找这些表以查找映射。当然,这将非常缓慢,因此有硬件缓存来加速它。