x86_64 中的中断成本是多少。例如由于页面错误导致的中断?内核需要多少周期来服务中断然后返回用户空间?我有兴趣只知道由于中断而产生的成本并将中断的用户级线程调度回来,因此我们可以忽略这里的中断处理程序内部发生的事情。
2 回答
对于普通中断(硬件 IRQ 或普通异常,如除以零),可能可以给出一个上限。
即使不涉及磁盘 IO,处理页面错误的时间也很难评估,因为 CPU 必须遍历页表,这会引入许多变量。页面错误的发生不仅是因为页面不存在,而且还因为访问违规(例如,试图写入只读页面)。在任何情况下,如果 TLB 中还没有页面映射(丢失的映射永远不会被缓存),CPU 将首先必须遍历多个级别的页表,然后才能调用页面错误处理程序。访问页表条目的时间(如果地址尚未缓存在 TLB 中)再次取决于某些条目是否已经在数据缓存中。
因此,从访问线性地址到调用 PF 处理程序的时间可能从 ~200 个周期(最好的情况;存在 TLB 条目,由于访问类型错误导致的异常——只是环切换)到 ~2000 个周期(不存在 TLB 条目,数据缓存中没有页表条目)。这只是 1) 执行出错的用户模式指令和 2) 执行页面错误处理程序的第一条指令之间的时间。
[旁注:鉴于此,我想知道是否可以构建使用分页的硬实时系统。]
这是一个复杂的问题,不能轻易回答。
您必须保存在中断中使用的所有(已使用)寄存器(标量、sse、fpu-state、avx 等)。
也许您必须更改虚拟地址空间上下文。
完成后,您必须重置已保存的上下文。
并且缓存/RAM 负载效应一直在改变所需的周期数。
(注意:不应分页中断,但不知道 linux 是否支持这一点,或者是否有可能)