C语言 sys_schedule() 在 Minix 3.1.8 中做什么?



我正在修改 Minix 3.1.8 中的调度程序,并想知道系统调用 sys_schedule(( 在 CPU 中做了什么。有人可以解释一下吗?

sys_schedule.c

PUBLIC int sys_schedule(endpoint_t proc_ep, unsigned priority, unsigned quantum)
{
message m;
m.SCHEDULING_ENDPOINT = proc_ep;
m.SCHEDULING_PRIORITY = priority;
m.SCHEDULING_QUANTUM  = quantum;
return(_kernel_call(SYS_SCHEDULE, &m));
}

Com.H

#define KERNEL_CALL 0x600   /* base for kernel calls to SYSTEM */ 
#  define SYS_SCHEDULE   (KERNEL_CALL + 3)  /* sys_schedule() */

kernel_call.c

PUBLIC int _kernel_call(int syscallnr, message *msgptr)
{
msgptr->m_type = syscallnr;
_do_kernel_call(msgptr);
return(msgptr->m_type);
}

国际刑警署

_PROTOTYPE( int _do_kernel_call, (message *m_ptr)           );

_ipc。S

ENTRY(_do_kernel_call)
/* pass the message pointer to kernel in the %eax register */
movl    4(%esp), %eax
int $KERVEC
ret

MINIX 中的任何系统调用都将切换到 SYSTEM 任务(这是您显示的代码,至少部分(。SYSTEM 任务有一个表,该表将SYS_XXX标记映射到do_xxx()子例程中。这些子例程通常包含在system/文件夹中的小源文件中。

在那里我们很快找到了do_schedule.c.3.1.8 中的该文件非常简单(这在 IIRC 一书中有明确的解释(,但为了给你一个简历,它会检查它的参数并将新的调度参数存储在调用进程表中;然后,这些新值可能会更改当 SYSTEM 任务结束其作业并即将返回到用户模式时将选取的进程。

Minix支持用户空间调度,这意味着用户空间进程负责为一个或多个处理器做出调度决策。当需要做出此类决策时,内核会调用调度程序进程。

sys_schedule系统调用的目的是启用此用户空间调度设计。调度程序可以调用sys_schedule来告诉内核如何调度给定的进程。请参阅有关用户空间调度的文档页面。

我已经写了SYS_SCHEDULE系统调用的描述,在官方文档更新之前,您可以参考它。

参数:

  • proc_ep:要重新调度的进程端点。
  • priority:要分配给进程的优先级。
  • quantum:运行进程的时间量。当进程超出量子时,内核将通知与进程关联的调度程序,内核可以调用sys_schedule来重新调度进程,从而再次将其置于可运行状态。如果进程未与用户空间调度程序关联,则 Minix 进程管理器 (PM( 会自动续订其量程。

返回值:

  • EINVALproc_ep包含不正确的进程编号。
  • EPERM:执行系统调用的进程不是与proc_ep关联的调度程序,因此它没有权限重新调度proc_ep指定的进程。
  • EINVAL:优先级或量程无效。
  • OK:呼叫成功。在这种情况下,进程已添加到与指定优先级关联的队列中。内核调度程序以轮循机制方式从优先级最高的队列开始调度进程。

请注意,_do_kernel_call不实现sys_schedule,而是执行int $KERVEC,这是一个执行用户到内核转换并调用与中断编号$KERVEC关联的中断处理程序的 x86 指令。然后,中断处理程序调用msgptr->m_type指定的系统调用的实际实现。(见@AntoineL的回答。

在用户空间中运行的 PM 使用该sys_schedule定期平衡优先级队列,并自动续订没有调度程序的进程量。

相关内容

  • 没有找到相关文章

最新更新