memory map driveru

Jaroslav Gratz xgratz01 na stud.fee.vutbr.cz
Středa Duben 18 02:32:20 CEST 2001


On Tue, 17 Apr 2001, Michl Ladislav wrote:

> zarizeni ocekava pole deskriptoru (architekrura MIPS, velikost stranky
> 4 kB) a na adresu jimi urcenou sype pres DMA data. funguje to asi tak, ze
> natahne prvni deskriptor a na adresu jim urcenou prenese 4kB dat, pak
> vezme dalsi deskriptor atd. tohle by se dalo zaridit pres get_free_page,
> ale zarizeni musi podporovat mmap a ja nevim jak takto alokovanou pamet
> mapovat ven. dalsi moznost je alokovat linearni pamet, ale tam jednak
> nevim jak ziskat deskriptory na jednotlive stranky a taky se vzhledem
> k fragmentaci alokace nemusi vzdy zdarit - jde o nekolik megabyte. jak z
> toho ven?

Co na to jit od lesa a nejdriv pamet alokovat a pak z ni teprve vyrobit
ty deskriptory (BTW to je presne co, jenom fyzicka adresa v pameti nebo i
neco dalsiho?). Neco jako:

ps = getpagesize();
buf = malloc(potrebna_pamet + ps);
mlock(buf, potrebna_pamet + ps);
if (buf & ps - 1) buf = (buf & ~(ps - 1)) + ps;
for (i = 0; i < potrebna_pamet; i += ps)
  {
    pa = virt_to_phys(buf + i); /*virt_to_phys je v <asm/io.h>*/
    /*Z fyzicke adresy vyrobit deskriptory pro zarizeni*/
  }

Pak se cely buffer da normalne nmapnout, protoze pri pristupu pres
logickou adresu buf + x se o vsechno postara strankovani. Jenom si nejsem
jisty, jestli nahodou kernel nekdy nepresunuje mlocknute stranky fyzicky v
pameti, pak by to fungovalo jenom chvili :) Nicmene nenapada me zadny
rozumny duvod, proc by se to melo delat, tak snad ne.

J.G.



Další informace o konferenci Linux