Assembly 如果处理器没有产生中断,系统软件必须做什么?

Assembly 如果处理器没有产生中断,系统软件必须做什么?,assembly,operating-system,interrupt,cpu-architecture,Assembly,Operating System,Interrupt,Cpu Architecture,与中断有关的问题 如果处理器不具备为中断提供服务的能力,系统软件将如何确保检测到每个键盘击键、注册每个鼠标移动、正确处理以太网(网络)数据以及成功将文件加载到内存中 轮询和协作多任务yield()在所有代码(包括用户空间)中调用,以便操作系统频繁地使用CPU,从而轮询硬件。 如果真正的中断服务是你唯一不允许拥有的东西,那么你仍然可以拥有处理设备信号的硬件机制,并创建需要服务的事情的优先级队列。因此,不用循环遍历每个驱动程序并让它轮询自己的硬件,轮询只需通过一次I/O读取检查需要维护的内容(如果有

与中断有关的问题

如果处理器不具备为中断提供服务的能力,系统软件将如何确保检测到每个键盘击键、注册每个鼠标移动、正确处理以太网(网络)数据以及成功将文件加载到内存中


轮询和协作多任务
yield()
在所有代码(包括用户空间)中调用,以便操作系统频繁地使用CPU,从而轮询硬件。

如果真正的中断服务是你唯一不允许拥有的东西,那么你仍然可以拥有处理设备信号的硬件机制,并创建需要服务的事情的优先级队列。因此,不用循环遍历每个驱动程序并让它轮询自己的硬件,轮询只需通过一次I/O读取检查需要维护的内容(如果有)。也许CPU不需要中断,而是在内核中支持该队列,因此检查需要维护的挂起的东西甚至不需要离开内核,只需要几个周期

这会稍微不那么可怕,开销也会稍微低一些,但仍然需要系统中所有的代码频繁地
yield()
,否则硬件的服务将远远落后

e、 g.循环中的一个无限循环错误,您希望它足够短,可以在没有
yield()
的情况下逃走,并且您的整个系统除了重置按钮外无法恢复锁定。(经典的MacOS是这样的,只是发生这种情况时你仍然可以移动鼠标。)


假定该系统的硬件设计不需要太多CPU交互,例如,为磁盘控制器提供一个带有一些DMA地址的命令缓冲区

您可能需要将鼠标控制器与视频卡集成,以便在不涉及CPU的情况下进行硬件光标移动

NIC将有一个硬件接收队列,在CPU对其进行检查的时间间隔内,有空间存储多个传入的以太网帧。(我认为现实生活中的NIC是这样工作的,至少是好的。在高流量条件下,真实的NIC驱动程序实际上可以/确实切换到轮询模式,而不是让硬件为每个传入的数据包发出中断,以减少CPU开销。特别是对于帧大小较小的10G/100G以太网。但轮询是通过计时器中断来完成的在100Hz或其他频率下的pt,而不仅仅是屈服()

文件是否已成功加载到内存中

磁盘控制器不知道文件,只知道块设备的扇区。但是,报告磁盘读取请求的完成可能是通过轮询

或者在低端系统上,磁盘I/O可以通过编程I/O完成,CPU必须单独读取每个字节或字,并将其存储到内存中。(x86上的IDE磁盘控制器过去是这样工作的,DMA是一个选项,但有些控制器有错误的DMA。因此Linux过去默认为PIO,您可以使用
hdparm
来启用DMA。虽然中断仍然存在,但我想,可能是为了让CPU知道数据何时可以在突发事件中从磁盘缓冲区复制出来。Y您不想让CPU旋转几毫秒,等待磁头查找,然后再开始传输。但在具有固态存储(如SSD/Flash)的系统上,查找时间要小得多,因此您可以简化它,并阻止整个系统启动I/O,直到扇区传输完成。)

如果处理器不具备为中断提供服务的能力,系统软件将如何确保检测到每个键盘击键、注册每个鼠标移动、正确处理以太网(网络)数据以及成功将文件加载到内存中

有两种方法可以实现IO

异步IO

执行IO的好方法是CPU请求设备执行IO,然后让CPU执行其他工作(包括运行其他程序),直到出现IRQ通知操作系统IO请求已完成。对于具有(例如)4个CPU和20个设备的计算机;这允许所有4个CPU和所有20个设备同时执行有用的工作。这是每个现代操作系统(包括现代“单任务”操作系统)都使用的方法

在这种情况下;如果没有IRQ,您必须通过非常频繁地检查IO请求完成情况来模拟它们(例如,可能在任何地方插入
check\u for\u IO\u completion()
函数调用),其中“多久”是“设备性能”之间的折衷(延迟,IO请求完成和操作系统知道IO请求已完成并能够启动下一个请求之间可以经过的时间)和“CPU性能”(所有
check_for_IO_completion()“用户空间”)没有好的折衷办法——无论您牺牲了多少性能,您都不能期望性能与使用IRQ时的性能相同

同步IO

执行IO的坏方法是CPU要求设备执行IO,然后不断轮询该设备,直到IO完成。对于具有(例如)4个CPU和20个设备的计算机,您不能同时发生超过4件事情(4个CPU中的每一个都在做有用的工作或等待IO请求完成)而且你总是会有至少20件硬件(设备或CPU)被浪费/无法做有用的工作

这是固件(例如BIOS和UEFI)使用的方法,因为它更简单,而且固件仅用于非常短暂的操作系统启动(主要涉及“从磁盘加载内核”,并没有从允许多个pi中获得多少好处)