2011-03-20 46 views
2

在Xen設置中,來自訪客虛擬機的IO訪問會通過名爲dom0的特權域,該域只是一個經過修改的Linux內核,該內核具有來自XEN管理程序的呼叫和來自XEN管理程序的呼叫。對於塊IO,它們有一個拆分驅動程序模型,其前端位於來賓虛擬機中,驅動程序的後端位於域0中。後端只是創建一個'生物'結構並調用submit_bio(),就像在傳統的linux塊驅動代碼中一樣。發佈從設備驅動程序的下半部分讀取的磁盤

我的目標是檢查寫入磁盤的數據是否有問題(數據丟失,寫入失敗,錯誤寫入等)。所以我需要讀取寫入磁盤的數據,並將其與數據的緩存副本進行比較(這是一種常見的磁盤功能,稱爲「讀後寫」)。我的問題是,是不是可以從我的後端驅動程序級別調用__bread()?當__bread被調用時,內核會崩潰。任何人都可以理解這個原因嗎?另外,如果這是不可能的,還有什麼其他方法可以從驅動器的下半部分讀取磁盤上的特定數據塊?

我可以攔截並克隆寫入的生物結構,並改變我的新生物中讀取的操作並再次調用submit_bio()?我做到了,但生物結構中由submit_bio()的完成回調返回的扇區號是一些隨機值,而不是我發送的。

謝謝。

回答

0

如果這是我的任務,我會嘗試先寫一個新的調度算法。首先複製cfqdeadlinenoopas調度代碼,然後在接受寫入請求後從那裏開始對其進行自我提交讀取命令。 noop可能是最簡單的修改後寫入立即並向上傳播錯誤,但我無法想象的性能會非常好。但是,如果您使用其他調度程序中的一個作爲基礎,那麼在寫入後立即指示錯誤可能會更加困難 - 也許在讀取再次調度之前幾秒鐘會過去 - 所以它實際上只會是事實上可用作診斷,而不是直接有益於應用程序的東西。