![]() |
1
2
Linux并不在乎你运行的是C还是C++程序。 当CPU检测到错误地址时,它会引发中断。没有合理的方法使用用户堆栈,因为它可能处于完全损坏的状态。对于这种严重的错误,内核有自己的私有堆栈。 事实并非如此。如果您通常调用内核为您做一些事情,那么内核可能会假定您有一个合理的可用堆栈。 |
![]() |
2
0
冒着过度简化和忽略任何特定操作系统细节的风险
大多数操作系统为每个进程分配一个(相对)小的内核模式堆栈。 当进程访问有效但未映射到物理页面帧的内存位置时,处理器会引发页面故障(异常)。这会导致CPU切换到内核模式。这导致处理器切换到进程的内核模式堆栈,并调用操作系统设置的页面错误处理程序。 每个进程(甚至线程)都必须有一个单独的内核模式堆栈,因为多个处理器可以同时处于内核模式(甚至在单处理器系统中)。 中断和异常处理程序必须使用内核堆栈(防止用户模式访问)作为安全措施。如果堆栈可以在用户模式下访问,那么有人可能会弄乱堆栈,然后调用内核模式处理程序。
异常(故障和陷阱)和中断由当前正在执行的进程处理,但在内核模式下完成。这是在PROCESS的虚拟地址空间中完成的。 所有进程都会共享一些内核模式地址。因为任何进程都必须能够处理中断,所以中断处理程序引用的所有地址都必须相同。某些系统(硬件)具有专用的内核地址范围。其他系统将页表配置为具有共享的系统地址范围。 |
![]() |
user3732361 · 读取大文件时如何选择块大小? 6 年前 |
![]() |
Sector · 将参数传递给自己的execv内核实现 6 年前 |
![]() |
Arka Pal · 关闭管道中未使用的端部 6 年前 |
![]() |
Nat · 释放malloc内存时程序停止工作 6 年前 |
![]() |
Mengfan Ma · 作者所说的操作系统中的目录结构是什么意思? 6 年前 |
![]() |
Mengfan Ma · 在何处执行磁盘调度 6 年前 |