Můžete mi prosím někdo vysvětlit, jak se adresuje "Statická paměť" a "statické proměnné" ? Když se podívám jak se to překládá, tak vidím úplně natvrdo instrukci mov adresa <- hodnota:
staticka=0x1111;
00401047 C7 05 D4 38 42 00 11 mov dword ptr [staticka (004238d4)],1111h
Předpokládám, že se ta adresa 004238d4 dá dohromady s nějakým registrem, protože kompilátor nemůže v době překladu
určit, že hodnota bude ležet na konkrétní adrese, ale nějak se mi nedaří zjistit, jak to vlastně funguje. Všude čtu, že se adresa určí "in compile time". Takhle jsem mohl určit adresu když jsem psal stroják pro Z80, ale pod současnými operačními systémy těžko. Takže mi něco podstatného pořád uniká.
Fórum › C / C++
Statická paměť- jak se to adresuje?
Lokální i globální Statické proměnné jsou (ponechme stranou význam v C jako jazyku)
obyčejná paměťová místa, která se opravdu určují v době kompilace.
Srovnám ti to se Z80, máš oblast vykonávaného programu a dejme tomu za ním oblast dat.
CCCCCCDDDD.
| |
0x400000 |
|0x4238D4
Stejný princip (binárního seskládání) je u Windows.
Představ si soubor 100KB dlouhý.
Od dejme tomu 0x400000 (daná standartní adresa Win) se natáhne Exe program
do paměti, někde v ní výkonné jádro končí třeba po 50KB.
A začíná právě oblast dat, která kopíruje tu samou co byla v souboru.
Pozor V OS se natáhne do jiné stránky paměti (tozn. i s jinými příznaky jako zápis,atd.).
Tam se nacházejí ty proměnné. Proto je jejich adresa známa jde o virtuální (RVA udaný v hlavičce) Posun stejný jako u souboru!
Jde o to jestli rozumíš assembleru a linkování (třeba i jen v DOSu).
(s registrem se u nich nepracuje, to jen u lokálních nestatických, tvořených na zásobníku)
Teprve dynamické proměnné při alokaci sahají do (neznámé oblasti-adresy) další stránky - haldy.
Pozn. Jednotlivé datové i kódové části samozřejmě mohou být na přeskáčku.
Taky mě napadlo že nerozumíš módu Chráněné virtuální paměti, kdy programy využívají stejnou adresu(ono totiž CPU přeloží to 0x400000 na úplně jinou lineární adresu do RAMky), a stránkování vůbec, ale to je fakt nadlouho.
Mám tu jednu nepřesnost, máš pravdu, že OS přece jenom do výpočtu adresy zasahuje
v momentě natahování a spouštění programu. Právě připočítává ten posuv 0x400000 (tzv. image base)
u všech míst která manipulují s pamětí. V originálu .EXE je jen - mov [238D4],něco
Snad to pomohlo k pochopení :)
No ale právě že v .EXE vidím to samé co ukazuje Disassembly okno v MS Visual C++, tedy mov 004238D4, 0x1111 například.
Ale to stránkování je asi to, co musím nastudovat. Měl jsem dojem, že se to dělá přávě segment registry jako u 8086, ale zřejmě jde o něco jiného ... Nemáš tip na nějaký tutorial, nebo alespoň vhodná klíčová slova do googlu? Chci mít představu, jak se ta adresa kterou vidím v disassembleru přepočítá na skutečnou adresu v RAM.
Tak to tě zajímá. Já studoval knihu Zdeňka Vrátila IBM PC.
Google : protected mode, 80386, virtual memory, CPU (+descriptor,GDTR,LDTR)
(ovšem je to dobré jen snad na tvorbu OS, v SoftICEu mi to nikdy nějak na nic nebylo)
A segmentové registry tam samozřejmě taky hrají svoji roli, pomocí nich a předtím tvořené tabulky všech deskriptorů dojde k prvotnímu překladu předfyzické adresy, atd. Nejdřív třeba začni od 80286 ta má zjednodušený mód a nemá to stránkování.
a Máš pravdu 4238D4 - obrovská OMLUVA za mystifikaci, nevim na co jsem myslel (asi na load APIn), když jsem to vypouštěl do éteru...
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Jak uvolnit pamět? — založil dasd
Jak vymazat pamět počítače — založil wswolf
Return - jak uvolnit paměť při jeho nevyužití — založil Jiri K
Statická ip — založil Onsi
Staticka metoda — založil jonhnw
Moderátoři diskuze