Assembly 操作系统软件任务调度

Assembly 操作系统软件任务调度,assembly,process,operating-system,Assembly,Process,Operating System,我想知道调度程序是如何从加载的汇编代码中恢复控制的?例如,我们可以编写一个程序体,从调度器向其传递控制 ;Do whatever we need to do before calling main() ;Call main or jump to it ;Do cleanup and stuff 那么,如何将程序流从主程序返回到调度程序呢? 我一直认为process loader可以注入jmp指令,将程序流返回给调度程序。有什么想法可以实现吗?调度程序不会注入跳跃或类似的东西。操作系统将其注册到

我想知道调度程序是如何从加载的汇编代码中恢复控制的?例如,我们可以编写一个程序体,从调度器向其传递控制

;Do whatever we need to do before calling main()
;Call main or jump to it
;Do cleanup and stuff
那么,如何将程序流从主程序返回到调度程序呢?
我一直认为process loader可以注入
jmp
指令,将程序流返回给调度程序。有什么想法可以实现吗?

调度程序不会注入跳跃或类似的东西。操作系统将其注册到中断服务例程。(isr)的cpu时间中断。

调度程序不会插入跳转或类似的内容。操作系统将其注册到中断服务例程。(isr)cpu的定时器中断。

操作系统被定时器中断,如果程序时间已过,它将调用调度程序,选择下一个程序执行,直到下一个中断。
如果您询问“操作系统如何知道程序执行已完成”-程序的进程在完成时进行系统调用,操作系统将该进程标记为死机,因此调度程序不会选择该进程执行。

操作系统被计时器中断,如果程序时间已过,则调用选择下一个程序执行的调度程序,直到下一次中断。
如果您询问“操作系统如何知道程序执行已完成”-程序的进程在完成时进行系统调用,操作系统会将该进程标记为死机,这样调度程序就不会选择它执行。

多任务处理要么是先发制人的,要么是可操作的

大多数操作系统使用抢占策略,即操作系统为线程分配一定的时间,允许线程运行。当计时器过期时,将生成一个中断,操作系统将强制切换到新任务(如果有)。除非提供Mecahnism,否则无法从用户空间中真正防止这种情况

在协同工作环境中,流程可以按需要运行多长时间。它必须显式地调用允许操作系统切换到新任务的函数。只要流程不这样做,理论上它可以永远运行


在这两种情况下,任务都可能执行系统调用,这要求任务等待,在这种情况下,任务切换也可能发生,直到等待的资源调用被满足。

多任务处理要么是先发制人的,要么是可操作的

大多数操作系统使用抢占策略,即操作系统为线程分配一定的时间,允许线程运行。当计时器过期时,将生成一个中断,操作系统将强制切换到新任务(如果有)。除非提供Mecahnism,否则无法从用户空间中真正防止这种情况

在协同工作环境中,流程可以按需要运行多长时间。它必须显式地调用允许操作系统切换到新任务的函数。只要流程不这样做,理论上它可以永远运行

在这两种情况下,任务都可能执行系统调用,这要求任务等待,在这种情况下,任务切换也可能发生,直到等待的资源调用被满足。

[short version]

OS加载程序不插入任何jmp或调用代码

在现代抢占式操作系统上,内核代码是通过中断输入的,可以是:

来自磁盘、NIC、KB、鼠标、计时器等外围设备的“真实”硬件中断会导致驱动程序运行

软件中断,即系统调用

任何一种类型的中断都可以请求调度程序运行并更改内核上运行的线程集

如果没有中断,内核将不会执行任何操作,因为它没有被输入。

[short version]

OS加载程序不插入任何jmp或调用代码

在现代抢占式操作系统上,内核代码是通过中断输入的,可以是:

来自磁盘、NIC、KB、鼠标、计时器等外围设备的“真实”硬件中断会导致驱动程序运行

软件中断,即系统调用

任何一种类型的中断都可以请求调度程序运行并更改内核上运行的线程集


如果没有中断,内核将不会执行任何操作,因为它没有被输入。

Timer。。以及所有其他至关重要的I/O中断。计时器。。以及所有其他至关重要的I/O中断。那么来自I/O外围设备的所有其他中断呢?这取决于实现,一些isr启动特定的驱动程序,一些提供缓冲区。。。很多方法都是可能的。您必须查阅操作系统文档以获得特定信息。那么来自I/O外围设备的所有其他中断呢?这取决于实现,一些isr启动特定的驱动程序,一些提供缓冲区。。。很多方法都是可能的。你必须查阅你的操作系统文档来获得一个特定的信息。在抢占式系统上,内核不做任何事情,除非它是通过系统调用或通过驱动程序的硬件中断输入的。(在大多数系统/操作系统上)计时器中断只是众多中断中的一个,显式或暗示地突出显示它会给大多数此类系统的运行方式留下很差的印象。@MartinJames,感谢您的解释。我认为这是一个实现细节,所以一般的概念仍然适用。唯一主流的协作多任务系统是MacOS x之前的Windows 3.x和MacOS。这两个系统都相当过时。@SevaAlekseyev,还有其他操作系统,不一定是主流的。事实上,我正在为一家拥有自己硬件的公司做这样的工作。在抢占式系统上,内核不做任何事情,除非它是通过系统调用或通过驱动程序的硬件中断输入的。(在大多数系统/操作系统上)计时器中断只是众多中断中的一个,显式或暗示地突出显示它会给大多数此类系统的运行方式留下很差的印象。@MartinJames,感谢您的解释。我认为这是一个实现细节,所以总体概念仍然适用