Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 系统调用通常是如何实现的_Linux_Windows_Multithreading_Operating System - Fatal编程技术网

Linux 系统调用通常是如何实现的

Linux 系统调用通常是如何实现的,linux,windows,multithreading,operating-system,Linux,Windows,Multithreading,Operating System,我正在实现一些非常类似于简单操作系统的东西,但我很难理解系统调用实际上是什么: 首先-在进程系统中,哪个线程通常*执行中断例程(syscall内核函数)-一个内核线程或一个用户空间线程,具有临时权限和例程地址? 系统调用机制将如何在用户空间中实现?以下两种机制是否大致匹配引擎盖下发生的事情? 实施A: //equivalent to assembly //MOV EAX sys_call_no //INT 0x80 void* interrupt(int service, void* args)

我正在实现一些非常类似于简单操作系统的东西,但我很难理解系统调用实际上是什么:
首先-在进程系统中,哪个线程通常*执行中断例程(syscall内核函数)-一个内核线程或一个用户空间线程,具有临时权限和例程地址?
系统调用机制将如何在用户空间中实现?以下两种机制是否大致匹配引擎盖下发生的事情?
实施A:

//equivalent to assembly
//MOV EAX sys_call_no
//INT 0x80
void* interrupt(int service, void* args)
{
   return kernel::int_vector[service](args);
}
实施B:

//equivalent to assembly
//MOV EAX sys_call_no
//INT 0x80
void* interrupt(int service, void* args, void* ret)
{
   kernel::intr_queue.push_back_syncd(interrupt_context(){kernel::int_vector[service], args, ret});
   waitForServiceCompleted();
   return ret;
}
//in kernel thread
while(true)
{
  while(!intr_queue.isEmpty())
  {
    auto context = intr_queue.pop();
    context.ret = context.func(context.args);
    notifyDone();
  }
}
C:我一点也不明白,它的工作原理完全不同
*通常我指的是目前最常见的桌面系统,如Windows7/8或最新的Ubuntu发行版

注意:抱歉,如果这不是发布此问题的正确SE站点-请评论我将其移动

实现A通常是它的工作方式。操作系统主要使用自己的线程来执行不直接响应特定进程请求的任务。当一个进程进行典型的系统调用时,该线程切换到内核堆栈并开始在内核上下文中运行内核代码。

谢谢-所以没有什么比syscall queue更好的了?(甚至不是为了从硬盘读取?)我很困惑存储在寄存器中的syscall参数是如何传递到内核的,这就很好地解释了线程只是保留了它们。@wondra肯定有各种各样的请求队列。但是像这样的系统调用是分为几个部分的。首先,发出请求。然后,如果且仅当需要时,线程将在内核空间中等待请求完成。例如,磁盘中断可能在发生劫持的任何线程中提供服务,然后它可能会释放由于
read
系统调用而暂时阻塞在内核空间中的线程。这使得不需要阻塞的系统调用尽可能便宜,所以它们被阻塞在内核空间内?很高兴知道-它真的把事情弄清楚了。但它提出了另一个问题,如果另一个线程得到磁盘中断,是什么机制通知原始线程的?查找文件描述符PCB的所有者,如果它被阻止,它会将其唤醒(这也意味着在PCB中有该文件的互斥)?操作系统有一种机制,使一个线程在内核空间中阻塞,并被另一个线程解除阻塞。通常,只需获得调度程序锁,将线程状态更改为“准备运行”,然后,如果有空闲CPU,向它们发送信号。