我已经看到了这个:实现用户级线程包,它不适用。
在分配线程并创建堆栈的 Thread_new(int func(void*)) 的实现过程中,如果我是正确的,我无法想出设置程序计数器 (%eip) 的方法,所以当线程由调度程序启动,它从给定函数的 (func) 入口点开始。
虽然我见过很多只使用 c(无汇编)的实现,但我们得到了以下代码(x86):
_thrstart:
pushl %edi
call *%esi
pushl %eax
call Thread_exit
将 %edi 推入堆栈是否有特定原因?除了字节复制,我似乎找不到 esi/edi 的其他用途。
我意识到对 *%esi 的间接调用可能用于从新线程的上下文中调用函数,但除此之外,我似乎不明白 %esi 如何(或什么)指向一个有效函数从 Thread_new 调用 _thrstart 时的地址
笔记:
Thread_exit 是清理线程,在 c 中实现。
这是家庭作业