评估Linux-CentOS / Intel机器上的SMI(系统pipe理中断)延迟

我有兴趣评估运行CentOS的Linux机器上SMI处理的行为(延迟,频率),并用于非常软的实时应用程序。

  1. 推荐哪些工具(CentOS的hwlatdetect?),以及对此采取何种行动?

  2. 如果没有好的工具可用于CentOS,我是否正确地假设在同一台机器上安装不同的操作系统应该会得到相同的结果,因为底层的硬件/ BIOS是相同的?

  3. 这些参数是否有任何球杆数据来源?

这些机器是X86_64架构,运行CentOS 6.4(内核2.6.32-358.23.2.el2.centos.plus.x86_64)。

在正常的操作过程中,SMI肯定会发生。 我的家用台式机在芯片组中每秒钟都有一个芯片组驱动的SMI。 由于BIOS驱动的CPU频率缩放方案,我也看到一些服务器每秒钟有两次。 但是,一些系统可能会长时间没有SMI发生,所以它真的取决于。

问题#1:hwlatdetect是检测系统中发生的SMI延迟的一个选项。 BIOSBITS是另一种选择,它是可以识别SMI是否发生的可启动CD。 你也可以通过创建一个内核模块来编写你自己的测试,这个内核模块在一个循环中旋转并且使用时间戳(使用RDTSC)。 如果在两个时间戳读数之间看到很长的差距,则可以查阅CPU MSR 0x34,查看SMI计数器是否递增,这表示发生了SMI。

如果你想产生一个SMI,你可以创建一个内核模块来执行一个OUT CPU指令来访问端口0xb2,例如写一个值0到这个端口。 (您也可以通过在写入端口0xB2之前和之后收集时间戳来计时此SMI)。

问题#2,SMI在操作系统下层操作,所以你选择的操作系统不应该有任何影响。

问题#3:BIOSBITS建议将SMI延迟保持在150微秒以下。

SMI会将您的系统置于SMM(系统管理模式)模式,这将在SMI处理期间推迟内核的正常执行。 换句话说,SMM既不是我们所知道的内核正常运行的实模式也不是保护模式,而是执行一些保存在SMRAM中的特殊指令(存储在BIOS固件中)。 为了检测它的延迟,你可以尝试触发一个SMI(它可以是软件生成的),并尝试捕获在SMM模式下花费的总时间。 要做到这一点,你可以编写一个Linux内核模块,因为你需要一些特殊的权限来发布一个SMI(我认为)。

对于实时系统,我认为如果你能避免像SMI这样的中断,这是很好的。

根据系统管理模式下的 Wikipage,在正常操作期间不使用SMI,除了模拟带有USB物理键盘的PS / 2键盘。

而且大多数Linux系统都能够驱动真正的USB键盘而无需仿真。 你可以配置你的BIOS来禁用它。

实际上,SMI不仅仅用于键盘仿真。 服务器使用SMI来报告和纠正ECC内存错误,ACPI使用SMI与BIOS通信并执行一些任务,甚至通过SMI启用和禁用ACPI,BIOS经常通过SMI拦截电源状态更改…还有更多,这只是几个例子。