我想知道调度器如何从加载的汇编代码中获得控制权?例如,我们可以编写一个程序主体,从调度程序向其传递控制权。操作系统软件任务调度
;Do whatever we need to do before calling main()
;Call main or jump to it
;Do cleanup and stuff
那么如何将程序流从主返回到调度程序? 我一直在想,进程加载器可以注入jmp
指令来返回程序流回调度程序。任何想法都可以工作?
我想知道调度器如何从加载的汇编代码中获得控制权?例如,我们可以编写一个程序主体,从调度程序向其传递控制权。操作系统软件任务调度
;Do whatever we need to do before calling main()
;Call main or jump to it
;Do cleanup and stuff
那么如何将程序流从主返回到调度程序? 我一直在想,进程加载器可以注入jmp
指令来返回程序流回调度程序。任何想法都可以工作?
[简版]
操作系统加载器不会插入任何jmp或调用代码。
在现代先发制人OS,内核代码是从中断输入,或者:
“真正”的硬件从如磁盘外设的中断,网卡,KB,鼠标,定时器,导致司机运行。
软件中断,即。系统调用。
任一类型的中断都可能请求调度程序运行并更改在核心上运行的一组线程。
如果没有中断,内核不做任何事情,因为它没有输入。
调度程序不注入跳转或类似的东西。 os将它注册到一个中断服务程序。 (isr)你的cpu的一个timerinterrupt。
OS被定时器中断,并且如果程序时间结束,它会调用调度器来选择下一个要执行的程序,直到下一个中断为止。 如果询问“OS如何知道程序执行已完成” - 程序的进程在完成时进行系统调用,并且OS标记该进程已死亡,因此调度程序将不会选择执行该进程。
定时器..和所有其他非常重要的I/O中断。 –
多任务既可以先发制人,也可以先发制人。
大多数操作系统使用先发制人的策略,这使得操作系统将一定量的时间分配给允许运行的线程。当定时器到期时,产生一个中断,操作系统强制切换到一个新的任务(如果有的话)。除非有提供的机制,否则不能真正阻止用户空间。
在工作环境中,只要需要,过程就会运行。它明确地需要调用一个允许操作系统切换到新任务的函数。只要这个过程没有这样做,它理论上可以永远运行。
在这两种情况下,都可能发生任务执行系统调用,这需要任务等待,并且在这种情况下还可能发生任务切换,直到等待资源调用完成。
在抢先式系统上,除非通过系统调用或硬件中断通过驱动程序输入内核,否则内核不会执行任何操作。计时器中断(在大多数系统/操作系统上)只是众多系统中的一个,并且明确地或暗示地突出显示了大多数此类系统的运行状况。 –
@MartinJames,谢谢你的解释。我认为这是一个实现细节,所以一般概念仍然适用。 – Devolus
唯一的主流合作多任务系统是在MacOS X之前的Windows 3.x和MacOS。两者都相当过时。 –
来自I/O外设的所有其他中断怎么样? –
这是实现的依赖,一些isr的启动特定的驱动程序,一些提供缓冲区,...许多方法都是可能的。您必须查看您的操作系统文档以获取特定信息。 – linluk