操作系统如何与CPU通信?

6

操作系统如何与CPU通信?

操作系统中有驱动程序,这一点我理解。操作系统使用驱动程序 -> 通信 -> 设备控制器。

通信是如何进行的?操作系统是否直接使用其命令触及CPU,还是使用BIOS作为接口?

假设我将制作自己的操作系统。它的唯一任务是向CPU发送算术运算并将结果打印到屏幕上。 我会告诉CPU将内存字放入寄存器中,计数它们,然后将它们放回内存中。我该怎么做?

2个回答

4

中央处理器通过中断调用操作系统执行特定任务,操作系统使用特殊的特权CPU寄存器来编程CPU。

例如,当您在键盘上按键时,硬件会生成中断。CPU调用中断处理程序函数(它是操作系统的一部分),该函数将处理按键事件,并将其传递到用户程序中。

另一个频繁的操作系统 - CPU 交互的例子是任务切换。大多数操作系统使用硬件定时器每秒产生约100个定时器中断。在此中断上,操作系统调度程序被调用,有时可以通过更改一些CPU寄存器来切换任务。在最简单的操作系统和CPU中,调度程序将更改SP(堆栈指针)和PC(程序计数器)寄存器。对于更复杂的CPU,它还将重新编程CPU的MMU硬件单元并更改许多内部控制寄存器。

外部硬件通常由驱动程序进行编程,通过执行PIO写入或写入映射PCI空间(写入硬件内存的特殊地址)。


操作系统通过将指令或单词放入寄存器来向CPU发出指令。操作系统是如何控制该寄存器的呢? - user3521129
大多数CPU都有特殊(特权)指令来处理特殊的CPU寄存器(例如,在x86中的WRMSR)。您了解哪些CPU架构? - osgx
好的,x86有“IP”(eip、rip)寄存器用于程序计数器。该寄存器保存要执行的指令的地址。因此,操作系统在从中断返回之前会准备用户空间IP寄存器。CPU将获取由IP指向的内存地址,并解码指令并执行它。 - osgx
那么,控制CPU核心是可能的吗?如果我有四个核心,我想让核心1只执行选定的指令集,而将其余部分交给core2。 - user3521129
用户3521129,为了将进程限制在某个核心上,您可以使用“taskset”命令行工具或“sched_setaffinity”系统调用(Linux)。要阻止其他任务在某个核心上被调度,您还需要切换到运行时调度策略(在Linux中为SCHED_FIFO或SCHED_RR)。您无法控制“一组指令”的CPU核心调度,只能控制进程和线程的调度。 - osgx

4
CPU只是从内存中某个偏移量开始运行指令,然后不断获取下一个指令并重复执行。启动加载程序设置CPU在计算机启动时开始运行操作系统入口点。键盘或鼠标输入等操作会引发中断,中断控制器使用这些中断来查找操作系统设置的特殊代码以处理这些中断。这些中断还用于允许操作系统使用特殊的特权指令切换当前正在CPU上运行的线程,这些特权指令只能在内核模式下运行。中断在调用操作系统中断处理程序代码之前使CPU切换到内核模式,以便操作系统可以使用必要的特权指令来控制各种行为,而用户模式代码则不允许。

涉及哪些寄存器用于什么目的等细节很多,但要覆盖所有内容需要一整本书。

这里 是一本免费的书,涵盖了相对入门级别的许多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接