2

在 Xen 设置中,来自来宾 VM 的 IO 访问通过一个名为 dom0 的特权域,它只是一个修改过的 Linux 内核,它可以调用来自和调用 XEN 管理程序。对于块 IO,它们有一个拆分驱动模型,其前端位于来宾 VM 中,驱动后端位于 domain0 中。后端只是创建一个“bio”结构并调用 submit_bio(),就像在传统的 linux 块驱动程序代码中一样。

我的目标是检查写入磁盘的数据是否存在任何问题(丢失的数据、静默损坏的写入、错误定向的写入等)。所以我需要读取写入磁盘的数据,并将其与缓存上的数据副本进行比较(这是一个常见的磁盘功能,称为“写后读”)。我的问题是,不能从我的后端驱动程序级别调用 __bread() 吗?调用 __bread 时内核崩溃。有人能理解这是什么原因吗?另外,如果这不可能,还有什么其他方法可以从驱动程序下半部分的磁盘中读取特定的数据块?

我可以拦截并克隆写入的 bio 结构,并在我的新 bio 中将操作更改为 read 并再次调用 submit_bio() 吗?我这样做了,但是 submit_bio() 的完成回调返回的 bio 结构中的扇区号是一些随机值,而不是我发送的那些..

谢谢。

4

1 回答 1

1

如果这是我的任务,我会先尝试编写一个新的调度算法。从复制cfqor deadlineor or or or or noopor asschedule code 开始,然后从那里开始处理它,以便在接受写入请求后自行提交读取命令。noop可能是最容易修改以在写入后立即读取并向上传播错误的方法,但我无法想象性能会非常好。但是,如果您使用其他调度程序之一作为基础,那么在写入后立即发出错误信号可能会更加困难——也许在再次安排读取之前已经过去了几秒钟——所以它实际上只是事后作为诊断有用,而不是可以直接使应用程序受益的东西。

于 2011-03-21T01:06:16.737 回答