我正在实现与简单操作系统非常相似的东西,但我很难理解系统调用的实际含义:
首先 - 在进程系统中,哪个线程通常 * 执行中断例程(系统调用内核函数) - 内核线程或用户空间线程之一被赋予临时特权和例程地址?
系统调用机制将如何在用户空间中实现——以下任何一项是否与幕后发生的事情大致匹配?
实现 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/