Hogyan működik az mmap ' ing / dev / mem annak ellenére, hogy kiváltságos módból van?
On február 9, 2021 by adminÉrtelmem szerint a felhasználói űrprogramok kiváltságos módban futnak, így nincs közvetlen hozzáférésük a memóriához vagy az I / O-hoz.
Akkor pontosan hogyan férhetünk hozzá közvetlenül a memóriához vagy az I / O helyekhez, amikor mmap / dev / mem használunk a felhasználói űrprogramokban?
Például:
int fd = 0; u8 leds = 0; fd = open("/dev/mem", O_RDWR|O_SYNC); leds = (u8 *)mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x80840000);
Ez a beágyazott eszközökben nagyon gyakran használt hack.
Mostantól a leds
változó menet közben is használható a hozzáféréshez. bármilyen eszköz, amely jelen lehet a 0x80840000 számon.
Már nem használunk semmilyen rendszerhívást a cím eléréséhez.
Még olyasmi is, mint
leds[0x20] = val;
működne.
De a kiváltságos műveletek, mint például az I / O címre történő közvetlen olvasás / írás, csak akkor lehetségesek, ha a processzort privilegizált módba állítják egy rendszerhíváson keresztül.
Forrás .
Megjegyzések
Válasz
Hozzáférés engedélyezése a /dev/mem
kiváltságtalan folyamatok által valóban biztonsági problémát jelentene, ezért nem szabad megengedni.
A rendszeremen a ls -l /dev/mem
így néz ki:
crw-r----- 1 root kmem 1, 1 Sep 8 10:12 /dev/mem
Tehát root
tudja olvasni és írni, a kmem
csoport (amiből véletlenül nincs) el tudja olvasni, de nem tudja megírni, és mindenki más egyáltalán nem tudja megnyitni. Tehát ennek biztonságosnak kell lennie.
Ha a /dev/mem
hasonló az enyémhez, akkor a privilegizált folyamatának egyáltalán nem is kellett volna képes megnyitnia a fájlt, nemhogy mmap
it.
Ellenőrizze a rendszeren a /dev/mem
engedélyeket, hogy megbizonyosodhassanak róla!
Megjegyzések
- De feltételezve, hogy én ezt vagyok gyökérként csinálom … Ez azt jelenti, hogy a root által futtatott folyamat kernelt kap szintű hozzáférési jogosultságokat?
- Nos, ha ' ezt rootként teszi, akkor mindenhez hozzáfér. Én ' nem vagyok biztos abban, hogy mit értesz " kernel szintű hozzáférési jogosultságok " A root minden bizonnyal bármit megtehet, amit akar, így vagy úgy (különösen például egy új kernelmodul létrehozásával és dinamikus betöltésével).
- Igen, hogy ' s helyes: amikor egy fájlt feltérképez, utána el kell olvasnia a & fájlt, sztönhívások használata nélkül. Ez ' igaz, függetlenül attól, hogy ' rendes lemezfájlt vagy speciális eszközt, például
/dev/mem
. Ha szeretné, megnyithatja a/dev/mem
oldalt, és kiadhatja aread()
éswrite()
rendszerhívásokat. Akkor nem küldene I / O-t bármilyen rendszerhívás használata nélkül. A végeredmény ugyanaz, de ha sok kicsi I / O van,mmap()
és a közvetlen hozzáférés valószínűleg kifejezetten jobban fog teljesíteni, mert nem ' nincs szükség rendszerhívásokra! Ez a szokásos fájlokra is igaz! - @ Stark07 szerintem ' elmulasztotta a lényeget. A
mmap
(és/dev/mem
) maguk NEM biztosítanak közvetlen hozzáférést a rendszermemória, és lehetetlen ezt megtenni a 4. gyűrűben. Ehelyett csak egy fájlt (vagy erőforrást) hozzárendel egy adott virtuális címhez a hívási folyamatban, csakúgy, mint ami történik egy program betöltésekor /exec
ed (ebben az esetben a program képemmap
a virtuális memóriába kerül). - TL; DR Egy kiváltságtalan folyamat nem közvetlen hozzáféréssel rendelkezik a rendszererőforráshoz, de megteheti ha ezt az erőforrást a virtuális címterükhöz hozzárendelik. . ' nincs különbség a verem / kupac / rodata / bármiféle és a kernelmemória elérése között – Végül mindkettő hozzáfér a tényleges fizikai memóriához, míg utóbbi esetben véletlenül a program ' vezérlés.
Válasz
A látható címek A felhasználói folyamat (akár rootként, akár nem jogosult felhasználóként fut) virtuális címek, amelyeket az MMU fizikai címekhez társít az oldal táblákon keresztül. Az oldaltáblák beállítása kiváltságos művelet, és csak kernelkóddal hajtható végre; azonban az oldal táblák beállítása után a memória elérése felhasználói módban megengedett.
Konkrétan a kódja az mmap
parancsot kéri a kerneltől a oldal táblák, amelyek lehetővé teszik a fizikai memória adott tartományának elérését. A kernel ellenőrzi a folyamat jogosultságait (olvasási / írási hozzáféréssel rendelkezik a /dev/mem
fájlhoz), és beállítja az oldaltáblázatokat, hogy hozzáférjenek a fizikai memóriához.
Válasz
A leds
értéke virtuális cím. Mindaddig, amíg a felhasználói térben van az aktuális folyamathoz képest a folyamat közvetlenül elérheti az utasításokat, például a leds[0] = val
utasításokat anélkül, hogy privilegizált módban kellene lennie, függetlenül attól, hogy a RAM-ban hova van leképezve ez a virtuális cím
*
aleds
, de ez az ' csak kód, nincs bizonyíték arra, hogy ez valóban kiváltságos felhasználóként működne; (korlátozott tapasztalataim szerint) minden gyökérként fut beágyazott eszközök.root
felhasználónak számos privilégiuma van, amelyek közé tartozik a hagyományok felülírása. fájlrendszer engedélyek. Néhány " fájl " valóban hozzáférés olyan eszközökhöz (például lemezhez vagy memóriához), amelyek a szokásos felhasználók számára korlátozottak. Nemroot
. De aroot
a felhasználói tér ben fut, tehát nem ' nem élvezheti a rendszermód teljes jogosultságait (kiváltságos utasítások végrehajtása, főleg).