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

标签 linux linux-kernel arm system-calls

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

在 ARM 中,系统调用在 SWI 模式下处理。我的疑问是我们是在 SWI 模式下执行全部必需的工作,还是只有部分工作在 SWI 模式下完成,然后我们转移到某个进程上下文?根据我的理解,某些系统调用可能会花费大量时间,并且在 SWI 中执行该工作不是一个好主意。

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

最佳答案

我认为您缺少两个概念。

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

当然,在Linux下,我们使用swi指令,并保持特权分离来实现系统调用,但这并不反射(reflect)ARM系统的普遍性。当您具体谈论 Linux 时,我认为引用内核模式与用户模式等概念更有意义。

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

考虑到这一点,您通常不必担心您的系统调用是否耗时太长。但是,如果您在系统调用上花费大量时间来执行不等待某个事件的操作,那么您很可能在内核中执行了本应在用户模式下执行的操作。

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

非阻塞系统调用几乎完全不同。系统调用处理函数通常会检查它是否可以立即返回数据而无需等待。如果可以,它将返回任何可用的东西。它还可以告诉用户“我目前没有任何数据,稍后再回来查看”或“仅此而已,没有更多数据可读”。这个想法是他们基本上立即返回并且不阻塞。

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

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

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

关于linux - 在 ARM 机器上的 Linux 中如何处理系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26381078/

相关文章:

java - eclipse 3.7 中的代理

linux - 什么是复合文档文件 V2 文档?

linux - 如何读取arm linux中的内核镜像?

c++ - 当调用函数时,堆栈帧真的会被插入堆栈吗?

linux - 如何重新排序服务启动 - CentOS?

linux - 如何编译 Intel x86 汇编代码以获取十六进制转储?

linux - Framebuffer、VT、tty 之间有什么关系?

linux - 如何从 struct page 获取 struct vm_area_struct

linux - kvm中hypercalls的入口在哪里?

java - 在 root 的 Android 上运行 Oracle Java Embedded Suite 7.0(ARM Linux 版本)