Minix 3.1.8中sys_schedule()的作用是什么?

我正在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);
}

ipc.h

_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
huan325 回答:Minix 3.1.8中sys_schedule()的作用是什么?

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

我们很快找到了do_schedule.c。 3.1.8中的文件非常简单(这在IIRC书中有明确说明),但是要给您提供简历,它会检查其参数并将新的调度参数存储在调用进程表中。这些新值可能会更改SYSTEM任务结束其工作并即将返回用户模式时将选择哪个进程。

,

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

sys_schedule系统调用的目的是启用此用户空间调度设计。调度程序可以调用sys_schedule来告诉内核如何调度给定的进程。有关用户空间调度,请参见documentation page

我已经写了一个SYS_SCHEDULE系统调用的描述,在更新official documentation之前,您可以一直使用它。

参数:

  • proc_ep:处理要重新安排的端点。
  • priority:分配给进程的优先级。
  • quantum:运行过程所需的时间。当进程用完量子时,与该进程关联的调度程序将由内核通知,内核可以调用sys_schedule重新调度该进程,从而使其再次处于可运行状态。如果该进程未与用户空间调度程序关联,则Minix进程管理器(PM)会自动更新其范围。

返回值:

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

请注意,_do_kernel_call并未实现sys_schedule,而是执行了int $KERVEC,这是一条x86指令,它执行用户到内核的转换并调用与之关联的中断处理程序。中断号$KERVEC。然后,中断处理程序将调用msgptr->m_type指定的系统调用的实际实现。 (请参阅@AntoineL的答案。)

运行在用户空间中的PM使用sys_schedule来周期性地平衡优先级队列,并自动更新没有调度程序的进程数量。

本文链接:https://www.f2er.com/3023512.html

大家都在问