Pokud chcete, aby OS úplně ignorujte, musíte vytvořit paměťovou díru pomocí "memmap
." Viz tento odkaz. Pokud například chcete 512 milionů na hranici 2 GB, můžete zadat "memmap=512M$2G
" na příkazovém řádku jádra.
Budete muset zkontrolovat dmesg
najít souvislou díru, kterou můžete ukrást, abyste nešlapali do žádného zařízení; který je specifický pro vaši základní desku+karty.
Toto není doporučený způsob, jak věci dělat - viz odpověď Warrena Younga, jak to správně udělat (ovladače jádra + DMA). Odpovídám přesně na otázku, kterou jste položil. Pokud to plánujete udělat pro koncové uživatele, budou nenávidět pokud jim to uděláš... věř mi, to je jediný důvod, proč jsem znal tuto odpověď.
Edit:Pokud používáte grub2 w/ grubby (např. CentOS 7), musíte se ujistit, že jste opustili $. Mělo by existovat jediné \
před $
. Příklad:
$ sudo -v
$ sudo grubby --update-kernel=ALL --args=memmap='128M\\$0x57EF0000'
$ sudo grubby --info $(sudo grubby --default-kernel) | grep memmap
args="ro crashkernel=auto ... memmap=128M\$0x57EF0000"
To, co požadujete, se nazývá DMA. Pro rezervaci této paměti musíte napsat ovladač.
Ano, uvědomuji si, že jste řekli, že nechcete, aby OS zasahoval, a ovladač se stane součástí operačního systému, ale bez výhrady ovladače se jádro domnívá, že veškerá paměť patří jemu. (Pokud jádru neřeknete, aby blok paměti ignorovalo, tedy podle Aaronovy odpovědi.)
Kapitola 15 (PDF) "Linux Device Drivers, 3/e" od Rubini, Corbet a Kroah-Hartmann pokrývá DMA a související témata.
Pokud chcete HTML verzi této kapitoly, našel jsem druhou verzi této kapitoly jinde online. Mějte na paměti, že 2. vydání je již více než deset let staré, protože vyšlo v době, kdy bylo jádro 2.4 nové. Na subsystému správy paměti v jádře bylo od těch dnů hodně práce, takže už to nemusí dobře platit.
Chcete-li rezervovat blok paměti z jádra v Linuxu založeném na ARM, můžete také použít reserved-memory
uzel v souboru stromu zařízení (dts). V dokumentaci jádra (viz zde) je příklad:
memory {
reg = <0x40000000 0x40000000>;
};
reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges;
/* global autoconfigured region for contiguous allocations */
linux,cma {
compatible = "shared-dma-pool";
reusable;
size = <0x4000000>;
alignment = <0x2000>;
linux,cma-default;
};
display_reserved: [email protected] {
reg = <0x78000000 0x800000>;
};
multimedia_reserved: [email protected] {
compatible = "acme,multimedia-memory";
reg = <0x77000000 0x4000000>;
};
};