我对ARM处理器上的Linux系统调用存有疑问。
在ARM系统中,调用以SWI
模式处理。我怀疑的是,我们是否在SWI
模式下执行了所有必需的工作,或者只有部分工作是在SWI
模式下完成,然后我们转移到某个流程上下文?根据我的理解,一些系统调用可能需要很长时间,并且在SWI
中执行该工作并不是一个好主意。
另外,我们如何返回调用用户进程?我的意思是在非阻塞系统调用的情况下,我们如何通过系统调用通知用户所需任务已完成?
答案 0 :(得分:1)
我认为你错过了两个概念。
swi
的使用都是系统调用的实现细节 当然,在Linux下,我们使用swi
指令并维护权限分离来实现系统调用,但这并不能反映ARM系统。当你专门谈论Linux时,我认为引用内核与用户模式等概念更有意义。
Linux内核已经抢先了很长时间了。如果您的系统调用花费的时间太长并超过分配给该进程/线程的时间量,则调度程序将启动并执行上下文切换。同样,如果您的系统调用仅包括等待事件(例如I / O),那么它将被切换出来,直到有可用的数据为止。
考虑到这一点,您通常不必担心系统调用是否需要太长时间。但是,如果您在系统调用中花费了大量时间来执行某些不等待某事件的事情,那么您可能会在内核中执行某些操作。应该在用户模式下完成。
当处理系统调用的函数返回一个值时,它通常会返回某种胶合逻辑,它恢复用户上下文并允许原始用户模式程序继续运行。
非阻塞系统调用几乎完全不同。系统调用处理函数通常会检查它是否可以立即返回数据而无需等待。如果可以的话,它会返回任何可用的东西。它也可以告诉用户"我目前没有任何数据,但稍后再回来看看#34;或者"全部,没有更多的数据需要阅读"。这个想法是他们基本上立即回归并且不会阻止。
最后,关于你的上一个问题,我怀疑你是否错过了系统调用的重点。
您永远不必知道任务何时完成'通过系统调用。如果系统调用没有返回错误,那么您,因为进程必须假定它成功。剩下的就是内核的实现细节。在非阻塞系统调用的情况下,他们会告诉您期待什么。
如果你能提供最后一个问题的例子,我可以更详细地解释一下。