我想知道调度程序如何从加载的汇编代码中获得控制权?例如,我们可以编写一个程序体,从调度程序传递控制。
;Do whatever we need to do before calling main()
;Call main or jump to it
;Do cleanup and stuff
那么如何将程序流从主程序返回给调度程序?
我一直在想过程加载器可以注入jmp
指令以将程序流返回给调度程序。任何想法都可以吗?
答案 0 :(得分:3)
[简短版]
OS加载程序不插入任何jmp或调用代码。
在现代抢占式操作系统上,内核代码是从中断输入的:
'真'硬件中断来自磁盘,NIC,KB,鼠标,计时器等外围设备,导致驱动程序运行。
软件中断,即。系统调用。
任何类型的中断都可以请求调度程序运行并更改在内核上运行的线程集。
如果没有中断,则内核不会执行任何操作,因为它没有输入。
答案 1 :(得分:2)
调度程序不会注入跳转或类似的东西。操作系统将其注册到中断服务程序。 (isr)你的cpu的计时器中断。
答案 2 :(得分:2)
多任务处理要么先发制人,要么执行。
大多数操作系统使用抢占式策略,这种策略会让操作系统为线程分配一定的时间,允许其运行。当计时器到期时,会产生一个中断,操作系统会强行切换到新任务(如果有的话)。除非提供了mecahnisms,否则无法真正阻止用户空间。
在kooperative环境中,只要需要,该过程就会运行。它显然必须调用一个允许操作系统切换到新任务的函数。只要这个过程没有这样做,它理论上就可以永远运行。
在这两种情况下,都可能发生任务执行系统调用,这需要任务等待,在这种情况下,任务切换也可能发生,直到等待资源调用被满足为止。
答案 3 :(得分:1)
OS被定时器中断,如果程序时间结束,则调用调度程序选择下一个程序执行直到下一个中断。 如果您询问" OS如何知道程序执行已完成" - 程序的进程在完成时进行系统调用,操作系统将该进程标记为死,因此调度程序不会选择执行它。