# 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/能看到该中断计数增加了