c - sys_schedule() 在 Minix 3.1.8 中做什么?

标签 c assembly x86 operating-system minix

我正在修改 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/

相关文章:

c - List 断言 ` l !=NULL' 失败

c - 将一行的前三个字符串读入单独的数组,然后将该行的其余部分读入 C 中的第四个字符串?

c++ - GCC C++ 异常处理实现

python - 为什么我在系统 DLL 上的 Powershell 和 32 位 Python 之间得到不同的 SHA1 哈希值?

multithreading - 锁xchg是否具有与mfence相同的行为?

c - 查看 char ** 指针链的两种方式以及指针类型可以混合吗?

c - c中的移位乘法不使用2的幂

c - while(i--) 通过 gcc 和 clang 优化 : why don't they use sub/jnc?

assembly - x86 程序集中的 `or al, al`

xcode - 如何在 Mac 框架中调用 cpuid 指令?