在 Xen 设置中,来自来宾 VM 的 IO 访问通过一个名为 dom0 的特权域,它只是一个修改过的 Linux 内核,它可以调用来自和调用 XEN 管理程序。对于块 IO,它们有一个拆分驱动模型,其前端位于来宾 VM 中,驱动后端位于 domain0 中。后端只是创建一个“bio”结构并调用 submit_bio(),就像在传统的 linux 块驱动程序代码中一样。
我的目标是检查写入磁盘的数据是否存在任何问题(丢失的数据、静默损坏的写入、错误定向的写入等)。所以我需要读取写入磁盘的数据,并将其与缓存上的数据副本进行比较(这是一个常见的磁盘功能,称为“写后读”)。我的问题是,不能从我的后端驱动程序级别调用 __bread() 吗?调用 __bread 时内核崩溃。有人能理解这是什么原因吗?另外,如果这不可能,还有什么其他方法可以从驱动程序下半部分的磁盘中读取特定的数据块?
我可以拦截并克隆写入的 bio 结构,并在我的新 bio 中将操作更改为 read 并再次调用 submit_bio() 吗?我这样做了,但是 submit_bio() 的完成回调返回的 bio 结构中的扇区号是一些随机值,而不是我发送的那些..
谢谢。