2014-07-12 26 views
1

我想問/驗證與blk_rq_map_sg映射的struct scatterlist的數組是否至少在虛擬地址域中都是連續的。那麼我們都知道分散列表主要用於DMA,其中每個scatter-gather(sg)數組元素描述一塊內存,並且這些塊在它們的物理地址中是不連續的。內核散列表在虛擬地址連續?

我正在寫一個塊設備驅動程序。假設我從我的request_queue接收到結構請求,並且我想對我的請求持有的I/O數據執行某些操作,例如memcpy將它們添加到某處。該操作將需要虛擬地址和長度參數。現在我所知道的是,我可以通過助手函數blk_map_rq_sg()映射的分散列表來訪問請求的數據。我的假設是否正確,那些sg元素是虛擬連續的,並且我可以通過sg_virt()獲取數據地址,並使用該地址和總長度作爲memcpy?或者它們在虛擬中不連續,並且我必須遍歷每個sg數組元素和memcpy到/從每個sg內存塊(虛擬)更難嗎?

+0

您是否嘗試過檢查blk_rq_map_sg的結果?如果他們不是連續的,那麼你不能假設他們是。如果他們*是*連續的,你仍然不能認爲它會在100%的時間內發生。 –

回答

0

writev這樣的函數允許提交不連續的請求,而高內存中的頁面沒有虛擬地址開頭。

要使用CPU訪問SG列表內容,請使用類似sg_copy_from_buffer的內容,該功能會臨時自動映射頁面。

相關問題