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

标签 linux windows multithreading operating-system

我正在实现与简单操作系统非常相似的东西,但我很难理解系统调用的实际含义:
首先 - 在进程系统中,哪个线程通常 * 执行中断例程(系统调用内核函数) - 内核线程或用户空间线程之一被赋予临时特权和例程地址?
系统调用机制将如何在用户空间中实现——以下任何一项是否与幕后发生的事情大致匹配?
实现 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:我完全不明白——它的工作原理完全不同。
* 通常我指的是最常见的当前桌面系统,如 window 7/8 或最新的 Ubuntu 发行版
注意:抱歉,如果这不是发布此问题的正确 SE 站点 - 请评论我以移动它

最佳答案

实现 A 通常是这样运作的。操作系统主要只将自己的线程用于不涉及直接响应特定进程请求的任务。当进程进行典型的系统调用时,该线程切换到内核堆栈并开始在内核上下文中运行内核代码。

关于linux - 系统调用通常是如何实现的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34007467/

相关文章:

ios - 如何在特定时间在后台下载/获取数据?

c - 如何跟踪标准输出或任何标准流?

regex - 使用正则表达式查找具有确切扩展名的文件(并且后面没有任何内容)

c++ - 如何在 Visual C++ 中使用 Windows 窗体创建特定控件?

Python Thread.start() 导致 AttributeError

java - Java线程中的定时器

c - UART 没有读取我想要的那么多数据

linux - 内核版本在 uname -r (Arch Linux) 中不更新

windows - 立即在控制台屏幕上的同一行上打印

windows - 以编程方式向 Windows Vista 防火墙添加异常(exception)