2016-01-29 19 views
0

我目前正在使用Windows內核驅動程序玩弄用戶空間的緩衝區。作爲一個玩具項目,我編寫了一個內核驅動程序,其作用是分配可在進程之間共享的內存。共享不是「4GO - PAGE_SIZE」更多的是爲了更好地瞭解Windows內部從內核空間與在Windows內核驅動

應用程序可以要求驅動程序創建任意大小的內存緩衝區。然後,驅動程序創建內核空間這個緩衝器與MmAllocatePagesForMdl,然後映射在用戶模式下此緩衝液MmMapLockedPagesSpecifyCache。生成的指針返回給可以直接在其中寫入的應用程序,就像在普通緩衝區中一樣。然後另一個應用程序可以要求驅動程序訪問該內存以讀取它(甚至可以寫入);驅動程序只需在新進程的上下文中已經存在的緩衝區上調用MmMapLockedPagesSpecifyCache。到目前爲止,一切都很好。

這個小更迭之後,我想創造在內核空間更大的緩衝區,我碰了壁。 MDL只能管理「4Go - PAGE_SIZE」。

我的第一個想法是使用MmAllocatePagesForMdl直到我滿足規模要求,使用下一頁指針鏈MDL創建幾個MDL,然後將指針返回到使用MmMapLockedPagesSpecifyCache用戶空間。但MmMapLockedPagesSpecifyCache不適用於鏈接的MDL,它只在用戶空間映射第一個MDL。

到現在爲止,我還沒有找到一種方法來比的連續虛擬內存4GO在用戶空間返回更多的從內核空間。內核空間中的分配不是問題,因爲我使用分頁內存,因此物理內存不必是連續的,但我無法找到如何映射連續虛擬內存中用於用戶空間的內存。

所以我要貪心,這是不可能的?或者我錯過了一些事情來做到這一點?

有關信息,這是一個64位的唯一的司機位和64個應用程序,因此在這裏沒有32位的限制。

回答

1

因此,無處不在,無法使用MDL。要超過4Go,我必須在我的驅動程序中創建部分。它相當於用戶模式下的CreateFileMapping。但是我不想依賴SharedMemory,因爲在內存分配/映射期間我有一些鎖。

然後亞歷克斯給了我一個奇妙的意見上osr forum爲了解決我最初的問題;與SEC_LARGE_PAGES選項一起使用CreateFileMapping。內存鎖已經消失了,我的速度與我的驅動程序一樣快,沒有可能由這樣的開發引起的所有問題。

相關問題