内核仅在发生异常时执行

时间:2018-08-22 19:30:54

标签: linux linux-kernel embedded-linux userspace

我正在学习嵌入式Linux。我似乎找不到下面针对我的问题的正确答案。

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

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

我不清楚,这是内核代码获得CPU控制的唯一机会吗?

例如,仅使用一个内核,如果用户应用程序代码正在运行,则无论中断是否发生,内核都不应不时地控制CPU以进行检查。也许有周期性的计时器中断允许这样做?

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

2 个答案:

答案 0 :(得分:2)

请阅读Operating Systems: Three Easy Pieces,因为需要整本书来回答您的问题。稍后,在source code的帮助下研究内核的https://kernelnewbies.org/

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

  

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

并非总是立即。如果您读取文件,则其内容可能位于page cache中(因此不需要物理IO)。如果需要磁盘访问(或联网),则内核将安排(了解preemptive scheduling),发生一些IO,并将上下文切换到其他可运行任务。很久以后,已经处理了几个中断(其中一些中断可能是由与您的IO相关的物理设备触发的),最后(几毫秒后)您的进程可能会从user space返回-read(2)-系统调用并再次运行。在此延迟期间,其他进程一直在运行。

  

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

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

答案 1 :(得分:0)

  

我不清楚,这是内核代码获得CPU控制的唯一机会吗?

是的,内核无法中断用户代码的运行。但是内核将设置计时器硬件,这将在一致的时间段之间生成计时器中断。内核利用它来执行任务计划。

  

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

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