Linux - použití MMAP

r23

Linux - použití MMAP
« kdy: 02. 01. 2015, 14:48:38 »
Pomocí MMAP si v linuxu mapuju fyzickou ardresu na virtuální, se kterou pracuji v aplikaci obslutující HW. Snažím se tím vyhnout nutnosti psaní ovladače. Zatím se to chová uspokojivě. Ale, má s tím někdo z Vás zkušenost?
Máte někdo zkušenost, jak z uživatelské aplikace chytit přerušení?
A dále - potřeboval bych vyhradit blok fyzické paměti, který bude pro OS nepřístupný, mělo by to jít boot argumentem, ale zatím jsem to nezkoumal, radu bych ocenil.
Je to můj první projekt s vestavným Linuxem, takže na tom sbírám zkušenosti. Většina funkcionality je implementována v HW tak, že procesor toho moc nedělá - programuje DMA, nastavuje (sem tam) pár registrů a odešle buffer po ethernetu.
V tomto projektu mi ovšem narastli nároky tak vysoko (souborový systém, FTP, SMB, webserver) že už by bylo neefektivní implementovat to jako bare metal.


Sten

Re:Linux - použití MMAP
« Odpověď #1 kdy: 02. 01. 2015, 18:06:50 »
mmap takhle natvrdo není moc vhodný, lepší je mít tam mezi tím ještě nějaký ovladač, který se bude starat o synchronizaci, přerušení, vyhrazuje paměť ap. mmapuje se logická adresa, ne fyzická; sice je často stejná či se liší o pevný offset, ale nemusí to tak být (a může se to měnit při každém startu či při aktualizaci jádra). Jen ovladač má možnost mapovat fyzickou adresu.

Zde je popis, jak funguje správa paměti v Linuxu.

r23

Re:Linux - použití MMAP
« Odpověď #2 kdy: 02. 01. 2015, 18:45:03 »
Díky.
Fyzická adresa je pevná a nikdy se nezmění. Synchronizaci sy vyřeším, to problém není. Je to uzavřený systém a kromě té jedné aplikace na to ani nikdy nic nesáhne. Vím, že to není čisté řešení, ale zdá se mi nejrychlejší a nejefektivnělší. Vyjíjet ovladač a rozhrní k tomu je spoustu další práce.
Mám rozchozený jeden blok - v podstatě paměť a DMA - chodí to dobře a rychle. Předpolkádám, že mmap to jen namapuje přes MMU, což se mi teoreticky zdá i nejrychlejší způsob, kterým to může fungovat.


Sten

Re: Re:Linux - použití MMAP
« Odpověď #3 kdy: 02. 01. 2015, 19:13:23 »
Díky.
Fyzická adresa je pevná a nikdy se nezmění. Synchronizaci sy vyřeším, to problém není. Je to uzavřený systém a kromě té jedné aplikace na to ani nikdy nic nesáhne. Vím, že to není čisté řešení, ale zdá se mi nejrychlejší a nejefektivnělší. Vyjíjet ovladač a rozhrní k tomu je spoustu další práce.
Mám rozchozený jeden blok - v podstatě paměť a DMA - chodí to dobře a rychle. Předpolkádám, že mmap to jen namapuje přes MMU, což se mi teoreticky zdá i nejrychlejší způsob, kterým to může fungovat.

Zase tolik práce by to nebylo. Ten ovladač by akorát namapoval fyzickou adresu na logickou, což by zpřístupnil přes nějaké blokové zařízení, který si namapuje ta aplikace přes mmap (takže má zaručeno, že ta paměť je skutečně na správném místě a nikdo jiný tam nehrabe; pořád to ale pojede přímo přes MMU) a zaregistruje si to přerušení s tím, že to bude nějak signalizovat té aplikaci (signálem, změnou stavu toho souboru či jak se vám to bude hodit). Tady je hezký příklady pro psaní ovladačů, tady je implementace mmapu do DMA (vám stačí první část s remap_pfn_range) a tady je registrování přerušení.