在ARM机器上的Linux中如何处理系统调用



我对ARM处理器上Linux中的系统调用有一些疑问。

在ARM中,系统调用以SWI模式处理。我的疑问是,我们是在SWI模式下执行全部所需的工作,还是在SWI模式下只完成部分工作,然后转移到某个流程上下文?根据我的理解,一些系统调用可能需要相当长的时间,在SWI中执行这项工作不是一个好主意。

此外,我们如何返回到调用用户进程?我的意思是,在非阻塞系统调用的情况下,我们如何通知用户所需的任务已通过系统调用完成?

我认为您缺少两个概念。

  1. CPU特权模式和swi的使用都是系统调用的实现细节
  2. 非阻塞系统调用不能以这种方式工作

当然,在Linux下,我们使用swi指令并保持权限分离来实现系统调用,但这并不能反映ARM系统的总体情况。当你具体谈论Linux时,我认为引用内核与用户模式这样的概念更有意义。

Linux内核已经抢占了很长一段时间。如果您的系统调用花费的时间太长,并且超过了分配给该进程/线程的时间量,则调度程序将启动并进行上下文切换。同样,如果你的系统调用只是等待一个事件(比如I/O),那么它就会被切换出去,直到有数据可用。

考虑到这一点,您通常不必担心系统调用是否花费太长时间。然而,如果您在系统调用中花费了大量时间,而该调用正在做一些不等待某个事件的事情,那么很可能您正在内核中做一些应该在用户模式下完成的事情。

当处理系统调用的函数返回一个值时,它通常会返回到某种粘合逻辑,恢复用户上下文并允许原始用户模式程序继续运行。

非阻塞系统调用几乎完全不同。系统调用处理函数通常会检查是否可以在不等待的情况下立即返回数据。如果可以的话,它会归还所有可用的东西。它还可以告诉用户"我现在没有任何数据,但稍后再查看"或"仅此而已,没有更多数据要读取"。这个想法是它们基本上会立即返回,并且不会阻塞。

最后,关于你的最后一个问题,我怀疑你错过了系统调用的要点。

您永远不应该知道系统调用何时"完成"了任务。如果系统调用没有返回错误,作为进程,您必须假设它成功了。其余的内容在内核的实现细节中。在非阻塞系统调用的情况下,它们会告诉您所期望的内容。

如果你能为最后一个问题提供一个例子,我也许可以更详细地解释。

最新更新