Kernel Scheduler(Linux) - 任务是函数吗?
Kernel Scheduler(Linux) - Is a task a function?
我查看了 Linux 内核源代码,我想知道内核将什么视为任务?因为显然 CPU 运行机器指令,所以我认为调度程序可能会获取程序主要功能的内存地址并将其放在 CPU 上。这至少是正确的吗?当我点击一个可执行程序时,调度程序内部实际上会发生什么?
编辑:
我在源代码中看到了几个与任务相关的结构,它们存储了一堆整数和浮点数(标志、优先级等)...但我想知道调度程序如何找到我程序的机器指令。
一个任务至少是一组寄存器值。其中之一是程序计数器。当内核切换任务时,它会将所有寄存器的当前值存储在旧任务的任务结构中。然后它从新任务结构加载所有寄存器值,最后加载程序计数器。这将恢复执行该任务。
现在难以理解的部分是,在大多数内核中,程序计数器在任务切换时根本不加载。那怎么切换任务呢?
诀窍是所有的任务切换总是在同一个函数中完成,这个函数必须用ASM来写。所以旧任务的程序计数器总是恰好是新任务的程序计数器。所以根本不需要加载。执行只是在原地继续。但是代码现在在新任务的上下文中运行。而当函数returns它returns从以前的新任务调用任务切换函数的地方。如果我说新的任务程序计数器是在任务切换函数 returns.
时从堆栈中加载的,也许更容易理解
无论如何,调度程序所做的是将整个 CPU 状态从一个任务切换到另一个任务。它不仅仅是 C 中的函数指针。如果您想要 C 中的等效项,请查看 setjmp() + longjmp()。
我查看了 Linux 内核源代码,我想知道内核将什么视为任务?因为显然 CPU 运行机器指令,所以我认为调度程序可能会获取程序主要功能的内存地址并将其放在 CPU 上。这至少是正确的吗?当我点击一个可执行程序时,调度程序内部实际上会发生什么?
编辑:
我在源代码中看到了几个与任务相关的结构,它们存储了一堆整数和浮点数(标志、优先级等)...但我想知道调度程序如何找到我程序的机器指令。
一个任务至少是一组寄存器值。其中之一是程序计数器。当内核切换任务时,它会将所有寄存器的当前值存储在旧任务的任务结构中。然后它从新任务结构加载所有寄存器值,最后加载程序计数器。这将恢复执行该任务。
现在难以理解的部分是,在大多数内核中,程序计数器在任务切换时根本不加载。那怎么切换任务呢?
诀窍是所有的任务切换总是在同一个函数中完成,这个函数必须用ASM来写。所以旧任务的程序计数器总是恰好是新任务的程序计数器。所以根本不需要加载。执行只是在原地继续。但是代码现在在新任务的上下文中运行。而当函数returns它returns从以前的新任务调用任务切换函数的地方。如果我说新的任务程序计数器是在任务切换函数 returns.
时从堆栈中加载的,也许更容易理解无论如何,调度程序所做的是将整个 CPU 状态从一个任务切换到另一个任务。它不仅仅是 C 中的函数指针。如果您想要 C 中的等效项,请查看 setjmp() + longjmp()。