我刚才问了一个类似的问题,但我可能没有正确地说。因此,如果进程A正在运行并且它在内存中的位置4000处导致页面错误,并且这会导致页面错误。执行将转移到内核。那么页面错误处理程序运行在哪个堆栈上?这是在内核的虚拟地址空间吗?或者是为这种类型的所有中断保留堆栈空间吗?
答案 0 :(得分:2)
Linux并不关心您是否正在运行C或C ++程序。
当CPU检测到有故障的地址时,会引发中断。没有合理的方法来使用用户堆栈,因为它可能处于完全损坏的状态。内核有这种严重错误的私有堆栈。
这种情况并非普遍存在。如果您通常调用内核为您做事,内核可能会认为您有合理的堆栈可用。
答案 1 :(得分:0)
存在过度简化和忽略任何特定操作系统细节的风险 -
那么页面错误处理程序运行在哪个堆栈上?
大多数操作系统为每个进程分配一个(相对)小的内核模式堆栈。
当进程访问有效但未映射到物理页面帧的内存位置时,处理器会引发页面FAULT(异常)。这会导致CPU切换到内核模式。这导致处理器切换到进程的内核模式堆栈并调用操作系统设置的页面错误处理程序。
每个进程(甚至线程)必须有一个单独的内核模式堆栈,因为多个处理器可以同时处于内核模式(即使在单个处理器系统中)。
中断和异常处理程序必须使用内核堆栈(受用户模式访问保护)作为安全措施。如果在用户模式下可以访问堆栈,那么有人可能会使用堆栈进行清理,然后调用内核模式处理程序。
这是在内核的虚拟地址空间吗?
异常(故障和陷阱)和中断由当前正在执行但在内核模式下完成的进程处理。这是在PROCESS的虚拟地址空间中完成的。
所有进程都会共享一些内核模式地址范围。因为任何进程都必须能够处理中断,所以中断处理程序引用的所有地址都必须相同。某些系统(硬件)具有专用的内核地址范围。其他系统将页表配置为具有共享的系统地址范围。