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

Operating system 操作系统中的页面错误处理程序在哪个堆栈上运行,operating-system,virtual-memory,Operating System,Virtual Memory,不久前我问了一个类似的问题,但我可能用词不正确。所以,如果进程A正在运行,它会在内存中的位置4000处导致页面错误,这会导致页面错误。执行将被转移到内核。那么页面错误处理程序将在哪个堆栈上运行?这是否在内核的虚拟地址空间中?或者是为所有此类中断保留的堆栈空间? Linux不关心是否运行C或C++程序,真的。 当CPU检测到一个错误的地址时,它会引发一个中断。没有合理的方法使用用户堆栈,因为它可能处于完全损坏的状态。对于这种严重故障,内核有自己的私有堆栈 情况并非普遍如此。如果您通常调用内核为您

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

Linux不关心是否运行C或C++程序,真的。 当CPU检测到一个错误的地址时,它会引发一个中断。没有合理的方法使用用户堆栈,因为它可能处于完全损坏的状态。对于这种严重故障,内核有自己的私有堆栈


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

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

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

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

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

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

中断和异常处理程序必须使用内核堆栈(不受用户模式访问的保护)作为安全措施。如果堆栈在用户模式下是可访问的,那么有人可能会破坏堆栈,然后调用内核模式处理程序

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

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


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

与PL或操作系统无关。对此,我深表歉意!这是出于习惯。如果问题是关于Linux内核(如最初标记的那样)?@l3x:“在操作系统中”,其余的内容显然更广泛。但我的意思是,Linux内核标记与操作系统标记相关。对于标记,很抱歉,这已经成为一种习惯。所以有一些特定操作的保留堆栈吗?@好奇:至少有一个,可能更多。(实现细节)。为什么在单处理器系统中需要为每个进程分配多个内核堆栈?页面错误处理程序不应被大多数其他中断抢占,对吗?如果页面错误处理程序在进程的虚拟地址空间中运行,当堆栈指针到达进程地址空间中非驻留/位错误的某个页面时,可能会导致页面错误。进程A触发页面错误。在为新页面读取磁盘时,进程B触发页面错误。在读取新页面的dicks时,进程C触发页面错误。(也可以用一个内核堆栈实现一个系统)。通常有一个单独的中断堆栈,当进程处理中断时使用。