我一直在尝试了解实现用户空间线程的机制。我无法理解堆栈和框架的机制。我遇到了两个非常棒的资源(这里和这里),它们解释了线程以及它是如何实现的,但我仍然不明白以下细节:
- 线程执行中如何使用机器上下文?我知道它由一个堆栈指针和一堆寄存器值组成。但是操作系统究竟是如何使用它来执行线程的呢?
- 为什么我们需要一个蹦床函数(mctx_create_trampoline)?在链接 #2 中,他们设置了一个函数作为信号处理程序,用于保存机器上下文并启动线程函数 (mctx_create_boot)。
- 基于这些函数,如何实现线程可以调用的“yield”函数?另外,我们如何中断正在运行的线程?我假设你有一个计时器和 SIGALRM,它会在它关闭时调用一个信号处理程序。但是如果 yield 函数切换上下文,那么信号处理程序将不会返回,这将阻止进一步的信号传递。