繁体   English   中英

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

[英]How system calls are handled in Linux on ARM machine

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

在ARM系统中,调用以SWI模式处理。 我的疑问是我们做执行总需求的工作SWI模式或工作中的一部分在做SWI模式,然后我们转移到一些进程上下文? 据我了解,某些系统调用可能会花费大量时间,而在SWI执行该工作并不是一个好主意。

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

我认为您缺少两个概念。

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

当然,在Linux下,我们使用swi指令并维护特权分离来实现系统调用,但这通常并不反映ARM系统。 当您专门谈论Linux时,我认为引用诸如内核与用户模式之类的概念更有意义。

Linux内核已经抢占了很长时间。 如果您的系统调用花费的时间太长,并且超过了分配给该进程/线程的时间量,则调度程序将立即启动并进行上下文切换。 同样,如果您的系统调用仅包含等待事件(例如I / O),则将其切换出去,直到有可用数据为止。

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

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

非阻塞系统调用几乎完全不同。 系统调用处理功能通常会在不等待的那一刻检查它是否可以返回数据。 如果可以,它将返回所有可用的内容。 它还可以告诉用户“我目前没有任何数据,但稍后再检查”或“仅此而已,没有更多数据可读取”。 他们的想法是他们基本上会立即返回并且不会阻塞。

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

您永远不必知道何时通过系统调用“完成”任务。 如果系统调用未返回错误,那么您将因为过程必须假定成功而已。 其余部分在内核的实现细节中。 在非阻塞系统调用的情况下,它们会告诉您期望什么。

如果您可以提供有关最后一个问题的示例,我也许可以详细解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM