gpt4 book ai didi

operating-system - 内核堆栈和用户堆栈有什么区别?

转载 作者:行者123 更新时间:2023-12-04 02:37:15 31 4
gpt4 key购买 nike

在同一个程序中使用两个不同的堆栈有什么需要? trap 如何将当前程序堆栈从用户堆栈更改为内核堆栈?完成系统调用后如何回到用户栈?

每个进程都有内核和用户堆栈吗?

最佳答案

每个 CPU 有(基本上)一个“内核堆栈”。每个进程都有一个“用户堆栈”,尽管每个线程都有自己的堆栈,包括用户线程和内核线程。
如何“捕获改变堆栈”实际上相当简单。
作为中断的结果,CPU 更改进程或“模式”。中断可能由许多不同的原因发生 - 发生故障(例如错误或页面错误),或物理硬件中断(例如来自设备) - 或计时器中断(例如,当进程使用所有这些都分配了 CPU 时间”)。
无论哪种方式 - 当调用此中断时,CPU 寄存器都保存在堆栈中 - 所有寄存器 - 包括堆栈指针本身。
通常然后会调用“调度程序”。然后调度程序选择另一个进程运行——恢复它保存的所有寄存器,包括堆栈指针,并从它停止的地方继续执行(存储在返回地址指针中)。
这称为“上下文切换”。
我正在简化一些事情——比如如何保存和恢复内存管理上下文,但这就是想法。它只是为了响应中断而保存和恢复寄存器——包括“堆栈指针”寄存器。
所以每个程序或线程都有它自己的(“用户模式”)堆栈(即多线程程序将有多个堆栈) - 并且上下文切换在这些堆栈之间切换。
更具体地说,当机器(或特定 CPU)在内核中运行时,存在“内核模式”堆栈。确切的处理是特定于操作系统的——例如,Linux 将每个 CPU 有一个中断(内核)堆栈(通常用于中断,包括页面错误和系统调用,它本质上包括几乎所有内容——比如设备驱动程序和调度程序) .与用户空间线程一样,Linux 内核也有单独的内核线程堆栈。 (Windows 内核做了一些不同的事情)。

关于operating-system - 内核堆栈和用户堆栈有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4941992/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com