2

我想從I/O內存(HIGHMEM)寫入一些數據到硬盤。 我已經使用io_remap_pfn_range()mmap了內存緩衝區。 我的應用程序使用O_DIRECT進行磁盤讀寫操作。 使用O_DIRECT,寫入將返回EFAULT(錯誤地址)。我將其跟蹤到了mm/memory.c中的__get_user_pages,其中IO頁 被拒絕。這與我目前的知識一樣深,可以讓我將其轉移到內核中。我不明白爲什麼IO指針不允許使用 。超快速磁盤IO是我們項目的一項要求,所以在 之間的任何複製都不是一種選擇。任何暗示是讚賞。使用O_DIRECT與IO內存

在此先感謝!

回答

1

我想,這一切發生,因爲VM_PFNMAP標誌(http://elixir.free-electrons.com/linux/v4.11.7/source/include/linux/mm.h#L174
當您使用io_remap_pfn_range,它設置VM_PFNMAP標誌(http://elixir.free-electrons.com/linux/v4.11.7/source/mm/memory.c#L1914),告訴「那些網頁是與常規結構不頁常規頁面」(見在上面的代碼中註釋)
__get_user_pages檢查此標誌並返回錯誤(http://elixir.free-electrons.com/linux/v4.11.7/source/mm/nommu.c#L136
PS在io_remap_pfn_range__get_user_pages中都有VM_IO標誌,所以在內核頁面上不會有任何I/O映射到用戶空間,或者任何人都會重寫內核內存