簡體   English   中英

來自用戶空間的連續物理內存

[英]Contiguous physical memory from userspace

有沒有辦法在linux中從用戶空間分配連續的物理內存? 至少有幾個保證連續的內存頁面。 一個巨大的頁面不是答案。

不,那里沒有。 確實需要從內核空間執行此操作。

如果你說“我們需要從用戶空間做這件事”——在內核空間沒有任何事情發生,那就沒什么意義了——因為用戶空間程序無法控制甚至不知道底層內存是否是連續的。

您需要這樣做的唯一原因 - 是如果您正在與需要此要求的硬件或其他一些低級(即內核)服務結合工作。 再說一次,你必須在那個級別處理它。

所以答案不僅僅是“你不能”——而是“你永遠不需要”。

我已經編寫了這樣的內存管理器,確實允許我這樣做 - 但它總是因為內核級別的一些潛在問題,必須在內核級別解決。 通常是因為總線上的其他一些代理(PCI 卡、BIOS 甚至另一台通過 RDMA 接口的計算機)具有物理連續內存要求。 同樣,所有這些都必須在內核空間中解決。

當您談論“緩存行”時 - 您無需擔心。 您可以放心,您的用戶存儲空間的每一是連續的,並且每一比高速緩存行(無論你在說什么架構)大得多。

是的,如果您只需要幾頁,這確實是可能的。

文件/proc/[pid]/pagemap現在允許程序檢查其虛擬內存到物理內存的映射。

雖然您無法顯式修改映射,但您可以只分配一個虛擬頁面,通過調用mlock將其鎖定到內存中,通過查找/proc/self/pagemap記錄其物理地址,然后重復直到恰好獲得足夠的塊相互接觸以創建足夠大的連續塊。 然后解鎖並釋放多余的塊。

它是駭人聽聞的,笨重的並且可能很慢,但值得一試。 另一方面,這很可能不是您真正需要的。

DPDK 庫的內存分配器使用@Wallacoloo 描述的方法。 eal_memory.c 該代碼是 BSD 許可的。

如果特定設備驅動程序導出物理連續的 dma 緩沖區,則用戶空間可以通過 dma buf apis 訪問,因此用戶任務可以訪問但不能直接分配

這是因為物理上連續的約束不是來自用戶應用程序,而是來自設備,所以只有設備驅動程序應該關心。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM