Vraag Aaneengesloten fysiek geheugen van gebruikersruimte


Is er een manier om aangrenzend fysiek geheugen uit gebruikersruimte in Linux toe te wijzen? Minimaal enkele gegarandeerde aaneengesloten geheugenpagina's. Eén grote pagina is niet het antwoord.


13
2017-12-09 18:48


oorsprong


antwoorden:


Nee er is geen. U do moet dit doen vanuit de Kernel-ruimte.

Als je zegt "we moeten dit doen vanuit de gebruikersruimte" - zonder dat er iets in de kernelruimte gebeurt, heeft het weinig zin - omdat een gebruikersruimteprogramma geen enkele manier heeft om te controleren of zelfs weten als het onderliggende geheugen aaneengesloten is of niet.

De enige reden waarom u dit zou moeten doen - is of u werkte in combinatie met een stuk hardware of een andere low-level (dat wil zeggen kernel) service die deze vereiste nodig had. Dus nogmaals, je zou er mee te maken krijgen dat niveau.

Dus het antwoord is niet alleen "u kunt niet", maar "u zou het nooit moeten doen".

Ik heb zulke geheugenmanagers geschreven dat do sta me toe om dit te doen - maar het was altijd vanwege een onderliggend probleem op kernelniveau, dat op kernelniveau moest worden aangepakt. Over het algemeen omdat een andere agent op de bus (PCI-kaart, BIOS of zelfs een andere computer via RDMA-interface) de fysieke aaneengesloten geheugenvereiste had. Nogmaals, dit alles moest in kernelruimte worden aangepakt.

Wanneer u spreekt over "cache-lijnen", hoeft u zich geen zorgen te maken. U kunt er zeker van zijn dat elk pagina van uw gebruikersruimte geheugen is aangrenzend en elk pagina is veel groter dan een cache-regel (ongeacht de architectuur waar je het over hebt).


13
2017-12-09 22:00



Ja, als u slechts een paar pagina's nodig heeft, is dit inderdaad mogelijk.

Het bestand /proc/[pid]/pagemap laat nu programma's toe om de mapping van hun virtueel geheugen naar het fysieke geheugen te inspecteren.

Hoewel u de toewijzing niet expliciet kunt wijzigen, u kan gewoon een virtuele pagina toewijzen, deze in een geheugen vergrendelen via een oproep naar mlock, noteer het fysieke adres via een opzoeking in /proc/self/pagemap, en herhaal tot je net gebeuren om genoeg blokken te krijgen om elkaar aan te raken om een ​​voldoende groot aangrenzend blok te maken. Ontgrendel en bevrijd vervolgens je overtollige blokken.

Het is hackish, onhandig en mogelijk traag, maar het is het proberen waard. Aan de andere kant is er een behoorlijk grote kans dat dit niet echt is wat je echt nodig hebt.


6
2017-08-20 23:20



DPDK bibliotheek's geheugen allocator maakt gebruik van approach @Wallacoloo beschreven. eal_memory.c. De code heeft een BSD-licentie.


1
2018-05-19 18:53



als een specifieke apparaatdriver dma-buffer exporteert die fysiek aansluitend is, kan gebruikersruimte toegang krijgen via dma buf apis zodat de gebruikerstaak toegang heeft maar niet rechtstreeks toewijst

dat komt omdat fysiek aaneengesloten beperkingen niet afkomstig zijn van gebruikersapplicaties, maar alleen van apparaten dus alleen apparaatbestuurders zouden erom moeten geven.


0
2018-02-25 02:03