2

我正在学习嵌入式Linux。我似乎无法为下面的问题找到正确的答案。

我的理解是,当用户空间的应用程序在执行时,如果我们要进行 IO 等,会进行系统调用,这会导致 SW 中断,一般会导致 MCU 从非特权模式切换到特权模式和内核将代表应用程序执行 IO。

发生硬件中断时的相似性,我猜这将导致模式再次切换并在内核中执行中断处理程序。

我不清楚的是,这些是内核代码控制 CPU 的唯一时间吗?

例如,只有一个内核,如果用户应用程序代码正在运行,内核不应该不时控制 CPU 来检查事情,不管是否发生了中断。也许有一个周期性的定时器中断允许这样做?

此外,如果我们有多个内核,内核是否可以一直在一个内核上运行而用户应用程序在另一个内核上运行?

4

2 回答 2

2

阅读操作系统:三个简单的部分,因为需要一整本书来回答您的问题。后来研究了内核的源码,在https://kernelnewbies.org/的帮助下

中断确实经常发生(可能每秒数百甚至数千)。在终端中尝试cat /proc/interrupts(参见proc(5))几次。

内核将代表应用程序执行 IO。

并不总是立即。如果你读取一个文件,它的内容可能在页面缓存中(然后不需要物理 IO)。如果需要磁盘访问(或网络),内核将调度(阅读关于抢占式调度)发生一些 IO 并将上下文切换到其他可运行任务。很久以后,已经处理了几个中断(其中一些可能由与您的 IO 相关的物理设备触发),最后(许多毫秒后)您的进程可以从read(2)系统调用返回 - 在用户空间中并被再次运行。在此延迟期间,其他进程一直在运行。

此外,如果我们有多个内核,内核是否可以一直在一个内核上运行而用户应用程序在另一个内核上运行?

这取决于很多(甚至取决于内核版本)。可能内核没有在同一个内核上运行。YMMV。

于 2018-08-23T04:58:40.913 回答
0

我不清楚的是,这些是内核代码控制 CPU 的唯一时间吗?

是的,内核不能中断用户代码的运行。但是内核会设置一个定时器硬件,它会在一致的时间段之间产生定时器中断。内核利用它来实现任务调度。

此外,如果我们有多个内核,内核是否可以一直在一个内核上运行而用户应用程序在另一个内核上运行?

您可以将多核系统视为多台机器,但它们共享内存,并且能够相互发送中断。

于 2018-08-23T04:48:33.863 回答