C语言 中断的成本是多少,以x86_64为单位



x86_64中断的成本是多少。例如,由于页面错误而导致的中断?内核需要多少周期来为中断提供服务,然后返回到用户空间?我感兴趣的是只知道由于中断和调度中断的用户级线程而导致的成本,因此我们可以忽略中断处理程序内部发生的事情。

对于临时中断(硬件 IRQ 或普通异常,如除以零),可能给出一个上限。

即使不涉及磁盘 IO,处理页面错误的时间也特别难以评估,因为 CPU 必须遍历页表,这引入了许多变量。发生页面错误不仅是因为页面不存在,还因为访问冲突(例如,尝试写入只读页面)。在任何情况下,如果 TLB 中尚不存在页面映射(永远不会缓存缺少的映射),则 CPU 首先必须遍历多个级别的页表,然后才能调用页面错误处理程序。 访问页表条目的时间(如果地址尚未缓存在 TLB 中)再次取决于某些条目是否已在数据缓存中。

因此,从访问线性地址到调用 PF 处理程序的时间可能是 ~200 个周期(最佳情况;存在 TLB 条目,由于访问类型错误而导致的异常 - 只是环形开关)到 ~2000 个周期(不存在 TLB 条目,数据缓存中没有页表条目)。这只是 1) 执行出错的用户模式指令和 2) 执行页面错误处理程序的第一条指令之间的时间。

[附带评论:鉴于此,我想知道是否有可能构建使用分页的硬实时系统。

这是一个复杂的问题,不容易回答。

您必须保存中断中使用的所有(已使用的)寄存器(标量,sse,fpu状态,avx等)。

也许您必须更改虚拟地址空间上下文。

完成后,您必须重置保存的上下文。

同时缓存/RAM 加载效果会改变所需的周期计数。

(注意:中断不应该被分页,但不知道 linux 是否支持这一点,或者它是否可能)

最新更新