我正在修改 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
最佳答案
MINIX 中的任何系统调用都会切换到 SYSTEM 任务(这就是您展示的代码的作用,至少是部分代码)。 SYSTEM task有一个表将 SYS_XXX
标记映射到 do_xxx()
子例程。这些子例程通常包含在 system/
文件夹中的小源文件中。
在那里我们很快找到do_schedule.c
。 3.1.8 中的该文件非常简单(IIRC 书中对此进行了清楚的解释),但是为了给您一个简历,它检查其参数并将新的调度参数存储在调用进程表中;这些新值可能会更改当 SYSTEM 任务结束其作业并即将返回到用户模式时将选择哪个进程。
关于c - sys_schedule() 在 Minix 3.1.8 中做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59065429/