HWRNG Core 注册、选择与熵注入
1. Core对象
硬件driver填充struct hwrng:
name;init/cleanup;read,或data_present/data_read;quality;- list、kref和completion。
通过hwrng_register()或devm_hwrng_register()加入Core。
2. /dev/hwrng
Core注册miscdevice:
1 | major 10 / HWRNG_MINOR |
只允许read open;write返回无效。Read从当前selected RNG取原始数据,并支持O_NONBLOCK。
3. 多RNG选择
Core维护rng_list和current_rng:
- 默认选择
quality最高者; - 用户可写
rng_current固定选择; - 当前RNG注销时自动切到最佳剩余源;
- 同名RNG禁止重复注册。
Sysfs属性:
1 | rng_available |
具体路径位于hwrng misc device对应sysfs节点。
4. Quality
quality范围0–1024,表示每1024位输入估计可credit的entropy bit数。它不是吞吐率,也不是统计测试分数。
设置过高会让内核过度信任硬件,设置为0则后台输入仍可mix但不credit。
Rockchip driver在本树声明quality=999,这是一项强信任假设,应结合硬件认证和健康检测评估。
5. 后台填充线程
选择current RNG后启动hwrng kthread:
1 | rng_get_data(wait=1) |
读取失败或无数据时使用hwrng_msleep()等待,也能被设备注销的dying completion唤醒。
6. Early Randomness
新RNG注册时,Core可能非阻塞读取32字节并调用add_device_randomness()。这只mix,不按quality直接credit。
7. 并发
rng_mutex:list和current选择;reading_mutex:硬件read、共享buffer和data_avail;- kref:当前RNG跨read生命周期;
cleanup_done:等待最后引用cleanup;dying:中断driver sleep。
Driver unregister会从list移除、切换current、停止fill线程并等待cleanup完成。
8. Driver回调
.read(rng, buf, max, wait):
- 返回生成字节数;
- 0表示暂时无数据;
- 负值表示错误;
- 不得写超过max;
wait=false不应长时间阻塞。
Core串行调用当前RNG read,但driver的probe/PM/error IRQ仍需自行同步。
9. PM
HWRNG Core不管理厂商clock。Driver应在read/init/cleanup或runtime PM中:
- enable clock/power;
- 等待ready;
- 读取并清状态;
- 停止generator;
- autosuspend。
10. 故障
硬件timeout不能回退为伪随机0数据。应返回errno,使Core可停止使用或切换其它RNG。
产品还应关注:
- 连续值检测;
- stuck-at故障;
- reset后重复序列;
- 低温/低压;
- virtualization伪造;
- 多源是否真正独立。
正在加载留言…