Správa paměti

Rax

Re:Správa paměti
« Odpověď #15 kdy: 03. 03. 2013, 23:27:50 »
nevíte někdo jak zjistím hodnoty relokačních (bázových) registrů pro jednotlivé stavy a úlohy v nich, pokud by došlo ke zhuštění?

Najít autora otázky a přiložit mu revolver ke spánku, protože celý tento model je patrně jeho osobní výmysl a správná odpověď se nachází jenom v jeho hlavě. Je silně nepravděpodobné že by tohle někdo realizoval.

Aby ses něco přiučil, tak na 32-bit x86 se to dělá takhle:
Každý proces má teoreticky 4 GB virtuální paměti, bez ohledu na fyzickou velikost RAM. Virtuální paměť je rozdělena na 4 KB stránky, každá stránka má vlastní fyzickou adresu v RAM. Procesor při přístupu sám překládá virtuální adresu na fyzickou v RAM. Stránka se zabírá na žádost aplikace přes služby OS a přístup k prázdné stránce způsobí chybu.

Opravim: tady se evidentně nejedná o stránkování, ale o segmentaci - nějakou hodně primitivní. Podle mě je architekturou 8086ka - podle velikosti paměti 1MB. Je to ale jen tip.

8086 neumělo ani segmentaci ani stránkování, celé to bylo o převlečeném výpočtu s*16+o.


PanKapitanRUM

Re:Správa paměti
« Odpověď #16 kdy: 03. 03. 2013, 23:49:09 »
Tak tohle je řekl bych RAXova silná stránka, ale hádat se stejně budu.
Adresování na x86 v reálném režimu bylo opravdu ve formátu segment:offset.
Nicméně 8086 paměť segmentovanou samozřejmě měl ::)
http://en.wikipedia.org/wiki/Intel_8086#Segmentation

Ostatně jak jinak adresovat paměť o velikosti cca 640KB?
Registr AX je 16-ti bitový.
16 bitů reprezentuje (teoreticky) nejvyšší hodnotu FFFFh resp. 65535 dec.
Tedy dostatečně velkou hodnotu pro pohyb v 64 kilech paměti.
MOV F000h,AH; Ulož na adresu F000 hodnotu registru AH (horní části AX (AH jako Hight, AL jako Low))
Adresování segment:offset tedy bylo pro EXE soubory přímo nezbytné.
MOV DS:AX,BH; Ulož na adresu určenou výpočtem DS:AX hodnotu BH...

Už si to fáááákt nepamatuju ::)
Teď už ani já nevěřím, že jsem v roce ~1994 progamoval docela dobře v ASM  ::)

Rax

Re:Správa paměti
« Odpověď #17 kdy: 03. 03. 2013, 23:58:40 »
Zdravím,
nevíte někdo jak zjistím hodnoty relokačních (bázových) registrů pro jednotlivé stavy a úlohy v nich, pokud by došlo ke zhuštění?

Našel jsem Cyrilkův PPT ( >:( :o :'( ) a hodnoty zjistíš podle velikostí procesů.
Tedy 1. proces má bázi 0 nebo prostě tam kde začíná volné místo
2. proces má bázi 1. procesu + velikost 1. procesu
3. proces má bázi 2. procesu + velikost 2. procesu
4. proces má bázi 3. procesu + velikost 3. procesu
...

Rax

Re:Správa paměti
« Odpověď #18 kdy: 04. 03. 2013, 00:18:17 »
Adresování na x86 v reálném režimu bylo opravdu ve formátu segment:offset.

Skutečně se to tak jmenovalo, jenže v 8086 byly začátky "segmentů" určeny napevno výpočtem segment*16 a trapně se tak překrývaly z velké části mezi sebou. Bylo to tak uděláno pro levnou portaci starých programů které uměly jenom 64 KB.

Teprve ve virtuálním režimu 80286 poprvé fungovala skutečná segmentace tak jak ji chápeme dnes a mohl sis tak určit odkud segment skutečně bude začínat a hlavně že se nebude překrývat s nějakým jiným.

Teď už ani já nevěřím, že jsem v roce ~1994 progamoval docela dobře v ASM  ::)

To já ti klidně věřím, v těch časech to umělo hodně lidí.