尝试进行上下文切换练习时,我发现了以下问题:
上下文保存和恢复似乎不是问题,但启动和停止任务似乎有点棘手。
虽然设置任务只是正确设置PC寄存器、堆栈指针和一些寄存器,但问题是,当任务结束时,我们无法控制下一步要做什么(我们不知道返回地址) )。
我想出了两个解决这个问题的方法:
- 设置过程的返回地址,告诉操作系统终止、释放与任务连接的内存并从队列中删除任务。
- 包装函数,该函数将在另一个函数中启动,该函数将作为被调用函数的参数指针。
第二个解决方案可能看起来更像下面的
void pre_startup(void(*funct)){
funct();
task_end();
}
作为参数,我们将适当的寄存器设置为指向任务的指针。
我的问题是:
操作系统如何处理所描述的问题?他们是否使用提到的解决方案之一,或者有一些不同的方法可以更好地处理这个问题?
最佳答案
在大多数平台上,C 运行时中的启动函数将在 main()
返回后调用 exit()
,例如
void _start(int argc, char **argv, char **envp) {
// call initializers...
int r = main(argc, argv, envp);
// call finalizers...
exit(r);
}
关于c - 操作系统中的任务的启动和停止是如何完成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43746648/