xv6 启动时多线程访问 mmio 寄存器有概率失败

我改了 xv6 代码,把 driver 初始化函数放在内核线程里执行,观察到大概几百次会出现一次 virtio-disk 读寄存器失败。有时候读 magic 值是 0,但是在报错里再读一次又是正常的。有时候读 magic 值正常,但是读 version 寄存器失败。

所以我觉得可能是其他线程的干扰。在读写时加上锁还有内存屏障后问题还是会出现,只是出现概率会减小。尝试过等所有 cpu 执行完 inithart 后再一起进入 scheduler 执行 driver init,这种情况下问题出现概率也会减小。只有在单线程执行时问题才不会出现,无论是改代码,让 driver init 在进 scheduler 之前执行完,还是启动 qemu 时设置 cpu 数量为 1。

感觉很像是数据不同步导致的,但我已经加了最严格的 fence iorw,iorw 问题也没有消失,所以现在也搞不懂了,有大佬知道原因吗?

1 个赞

你的源码链接在哪?能分享下么

抱歉没看到消息。

出问题的代码在这个提交之前:

我现在已经回退到单线程执行初始化了。