Statická paměť- jak se to adresuje? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Statická paměť- jak se to adresuje? – C / C++ – Fórum – Programujte.comStatická paměť- jak se to adresuje? – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Jirka
~ Anonymní uživatel
284 příspěvků
31. 10. 2008   #1
-
0
-

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á.

Nahlásit jako SPAM
IP: 195.113.228.–
Reklama
Reklama
o-lox0
Super člen
1. 11. 2008   #2
-
0
-

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.

Nahlásit jako SPAM
IP: 85.71.152.–
o-lox0
Super člen
1. 11. 2008   #3
-
0
-

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í :)

Nahlásit jako SPAM
IP: 85.71.152.–
Jirka
~ Anonymní uživatel
284 příspěvků
2. 11. 2008   #4
-
0
-

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.

Nahlásit jako SPAM
IP: 195.113.228.–
o-lox0
Super člen
2. 11. 2008   #5
-
0
-

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...

Nahlásit jako SPAM
IP: 85.71.152.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 38 hostů

Podobná vlákna

Jak uvolnit pamět? — založil dasd

Jak vymazat pamět počítače — založil wswolf

Statická ip — založil Onsi

Staticka metoda — založil jonhnw

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý