Portál AbcLinuxu, 7. května 2025 07:16
Chci si zeptat pro vlastni jistotu jestli spravne rozumim funkci mmap. Jedna se o mapovani casti pameti ARMv5 procesoru. Jestli spravne rozumim funkci mmap, tak v kodu co uvadim nize pointer map_base bude odkazovat na zacatek bloku pameti nebo na prvni registr o rozmeru 4096 v pripade,ze offset =0. V pripade,ze offset bude 4095 tak bude odkazovat na konec (posledni registr). Offset ma byt kladne cislo?
C
fd = open("/dev/mem", O_RDWR | O_SYNC));
map_base = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset);
FreePascal
fd := fpopen('/dev/mem', O_RDWR or O_SYNC));
map_base := fpmmap(0, 4096, PROT_READ or PROT_WRITE, MAP_SHARED, fd, offset);
Řešení dotazu:
Diky za odpoved'. Omlovam se za nespravne formatovni. Prehledl jsem to. U ARMu velikost stranky je take 4096 (4k). Pod registem myslim bunku pameti. U ARMu registry jsou 32 bitove. Tak v pripade stranky o velikosti 4096 bytu budu mit namapovanych 1024 registru o velikosti 32 bitu.
C map_base = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 4096); FreePascal map_base = fpmmap(nil, 4096, PROT_READ or PROT_WRITE, MAP_SHARED, fd, 4096);
Jestli sprvane chapu pri offsetu 4096 pointer map_base bude odkazovat na konec namapovane stranky pameti
mmap
em nemají nic společného. Pokud nepíšeš v assembleru nebo neoptimalizuješ nějaký extrémně kritický algoritmus (což nakonec stejně skončí psaním assembleru), tak se registry vůbec nemusíš zabývat, překladač totiž jejich používání vyřeší za tebe getpagesize()
(běžně je to 4 096 bajtů, ale může to být třeba i 4 MiB, záleží na architektuře a jejím nastavení) a násobky této hodnoty lze používat jako offset pro mmap
.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.