基于用户态外部中断的驱动性能分析

测试环境

硬件平台:4x Rocket Core @ 100MHz, 2MB L2 Cache, 16MB DRAM 外设:2x AXI UART 16550 @ 6.25M baudrate

吞吐率

串口配置为 8 比特字长,无校验位, 1 停止位,理论吞吐率为 625KB/s 。

测试场景内核,中断用户,轮询用户,中断
裸机,无哈希396542438
裸机,有哈希123189136
rCore-N,有哈希78410260
rCore-N,有哈希55152123

“有哈希”指每次发送或接收时均进行一次 blake3 Hasher::update() 计算,用来模拟计算和 IO 混合负载。 表中数据单位为 KB/s 。

可见用户态轮询模式驱动性能最高,在裸机场景下可以接近理论上限;用户态中断性能次之,内核态的中断模式驱动性能最低。

驱动延时追踪

read 系统调用:

read

可见在 14000 和 26000 附近出现了两个峰。

write 系统调用:

write

耗时集中在 40000 个周期附近。

作为对照,get_time 调用的耗时情况如下:

gt

get_time 的逻辑较为简单,可以认为是一次系统调用的“背景”耗时,集中在 14000 个周期附近。 read 调用的一个峰基本与背景延时重合,推测为缓冲区中恰有数据的情况, 而 26000 对应的峰推测为缓冲区中无数据而需要等待串口传输的情况。

内核态中断:

sei

一个峰出现在 2500 周期附近且较集中,另一个峰出现在 10000 周期左右,且散布较宽。

用户态中断:

uei

用户态中断驱动一个峰出现在 1800 周期附近,另一个在 4600 附近,整体周期数大幅低于内核态中断驱动, 且分布更集中,波动较小。这可能是由于用户态驱动具有更好的代码和访存局域性。