代码之家  ›  专栏  ›  技术社区  ›  Curious

操作系统中的页面错误处理程序在哪个堆栈上运行

  •  1
  • Curious  · 技术社区  · 9 年前

    不久前我问了一个类似的问题,但我可能用词不对。因此,如果进程A正在运行,并且它在内存中的位置4000处导致页面错误,则会导致页面错误。执行将转移到内核。那么页面错误处理程序将在哪个堆栈上运行?这是在内核的虚拟地址空间中吗?还是为所有此类中断保留堆栈空间?

    2 回复  |  直到 9 年前
        1
  •  2
  •   MSalters    9 年前

    Linux并不在乎你运行的是C还是C++程序。

    当CPU检测到错误地址时,它会引发中断。没有合理的方法使用用户堆栈,因为它可能处于完全损坏的状态。对于这种严重的错误,内核有自己的私有堆栈。

    事实并非如此。如果您通常调用内核为您做一些事情,那么内核可能会假定您有一个合理的可用堆栈。

        2
  •  0
  •   user3344003    9 年前

    冒着过度简化和忽略任何特定操作系统细节的风险

    那么页面错误处理程序将在哪个堆栈上运行?

    大多数操作系统为每个进程分配一个(相对)小的内核模式堆栈。

    当进程访问有效但未映射到物理页面帧的内存位置时,处理器会引发页面故障(异常)。这会导致CPU切换到内核模式。这导致处理器切换到进程的内核模式堆栈,并调用操作系统设置的页面错误处理程序。

    每个进程(甚至线程)都必须有一个单独的内核模式堆栈,因为多个处理器可以同时处于内核模式(甚至在单处理器系统中)。

    中断和异常处理程序必须使用内核堆栈(防止用户模式访问)作为安全措施。如果堆栈可以在用户模式下访问,那么有人可能会弄乱堆栈,然后调用内核模式处理程序。

    这是在内核的虚拟地址空间中吗?

    异常(故障和陷阱)和中断由当前正在执行的进程处理,但在内核模式下完成。这是在PROCESS的虚拟地址空间中完成的。

    所有进程都会共享一些内核模式地址。因为任何进程都必须能够处理中断,所以中断处理程序引用的所有地址都必须相同。某些系统(硬件)具有专用的内核地址范围。其他系统将页表配置为具有共享的系统地址范围。