# io_emulator **Repository Path**: claud_ling/io_emulator ## Basic Information - **Project Name**: io_emulator - **Description**: 一种软件模拟的故障注入方法 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-09-22 - **Last Updated**: 2023-09-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # io-emulator ## 简介 io-emulator可对业务驱动中的寄存器读写注入错误 其工作原理简单概括为: - 通过kprobe机制劫持指定module的ioremap(), 给其返回非法地址 - io emulation: 当module访问寄存器时产生page fault, 在page fault处理中, 执行真正的IO访问动作. (比如vpps读寄存器A, 将陷入异常处理,我们在异常处理中读寄存器A后,返回之前的上下文。整个过程vpps并不感知) - fault inject: 在io emulation过程中,我们可以控制是否要注入错误。提供debugfs接口来控制fault inject行为 ## 使用步骤 1) 先加载io-emulator.ko 2) 再加载业务ko(cnUDM, mps等) 3) 运行业务 ## 寄存器错误注入 4) 对指定的寄存器注入错误(这里以vpps为例) ```bash cd /sys/kernel/debug/fault_injection echo 0x8000350060 > inject ``` >执行完之后, 生成该寄存器的目录, 有如以下debugfs entries:
> - access_size: 地址类型(8/16/32/64), 默认32.
> - probability: 错误发生概率百分比(1-100), 默认100
> > - rd_forcing: 是否要进行读注错。echo {Y | N} > rd_forcing
> - rd_value: 读到的错误值。
> > - wr_forcing: 是否要进行写注错。echo {Y | N} > wr_forcing
> - wr_value: 写入的错误值
> > - times: 错误发生的次数。 echo 1 > times
```bash cd 8000350060 echo Y > rd_forcing echo 0x20 > rd_value echo 1 > times ``` ## 触发中断 一般情况下,中断都是由硬件中断线触发的。io-emulator也支持模拟触发一个异常中断上报的场景,并不依赖硬件
- 首先cat /proc/interrupts/查看中断号,例如vpps_vi_irq中断号是61 - taskset 0x4 echo 61 > /sys/kernel/debug/fault_injection/triger_interrupt。即可在CPU2上触发中断, cat /proc/interrupts/能看到该中断计数增加了