尝试用上下文切换练习我发现了以下问题:
上下文保存和恢复似乎不是问题,但启动和停止任务似乎有点棘手。
虽然设置任务只是正确设置PC寄存器,堆栈指针和一些寄存器,但问题是,当任务结束时,我们无法控制下一步会做什么(我们不知道返回地址) )。
我想出了两个解决这个问题的方法:
第二种解决方案看起来更像是跟随
void pre_startup(void(*funct)){
funct();
task_end();
}
作为参数,我们将正确的寄存器设置为指向任务的指针。
我的问题是:
操作系统如何处理所描述的问题?他们是否使用上述解决方案之一,或者有更好的方法来处理这个问题?
答案 0 :(得分:1)
在大多数平台上,C运行时中的启动函数将在exit()
返回后调用main()
,例如
void _start(int argc, char **argv, char **envp) {
// call initializers...
int r = main(argc, argv, envp);
// call finalizers...
exit(r);
}
答案 1 :(得分:1)
这是所有系统特定的,但在较高级别,您可以通过以下方式实现exit()或其等效项:
答案 2 :(得分:-1)
他们使用内存控制器来移动内存 - 这会交换内存的整个部分,包括所有堆,堆栈和可执行文件,还原寄存器,程序计数器,堆栈指针。等。见: