» »

Delovanje x86 Memory Segmentation

Delovanje x86 Memory Segmentation

parcopat ::

Živijo!
Torej zadeva je taka, pred kratkim sem se začel učiti Javo (moj prvi prog. jezik) in je v tutorialu model govoril o GC-ju v 7 in seveda ker je 8 verzija zunaj, sem moral it pogledat razlike, itd. No in nato naletim na nek članek, ki vmes govori tudi o omejitvah strojne opreme in ker poznam samo grobe osnove, večinoma to, kar smo se učili pri informatiki v 1. letniku, me seveda zanima še malo bolj obsežno. No ja in zanimalo me je, kako so delovale stvari, če je bil address bus večji kot so bili registri CPUja in tako pridem do tegale članaka na wikipediji. In ker je problem sedaj je, da bolj kot berem tole bolj me zmede, kako je vse to delovalo, tako da če bi si lahko kdo vzel 10 min časa in mi tole lepo po slovensko razložil bi bil zelo hvaležen, ker me firbec matra.

Kaj se mi zdi, da mi je zanenkrat jasno je sledeče torej (glede na angleško wikipedijo), je komunikacija med RAMom in CPUjem sledeča, torej naslov sestavimo s pomočjo 2 delov -- segmenta in offseta. Segment lahko ram postavi povsod kjer je začetno število naslova deljivo z 16. Sam segment je dolg 20 bitov ampak ima za zadnje 4 bite same ničle. Nato je še offset, ki pa ma 16bitov in ga nato prištejemo segmentu, da dobimo ven spet efektiven 20 biten naslov. Ampak ta naslov je lahko enak tudi drugim segmentom in offsetom, tako da, kako točno jih razlikujemo in kje dobimo offset(delček segmenta?), glede nato, da je CPU lahko procesiral cel segment na enkrat ane? Poleg tega rešitve te težave čisto ne razumem, torej zadnji naslov se začne pri FFFF0, ki gre lahko, če mu prištejemo še offset, čez 20bitov. In ja glede na to, da so morali naslovi iti čez poseben segmentni procesor in da je ta rabil počakat na 2 16 in 20 bitna podatka ali ni to vbistvu upočasnilo sistema?

Hvala za odgovore!

noraguta ::

Memory bus nima veze, problem je bil da je bil naslivni prostor(register) premajhen (prekratek). ne sekeri se dons vec za to.
Pust' ot pobyedy k pobyedye vyedyot!

sas084 ::

Tko kot je noraguta reku, problem je bil pri velikosti registrov. V real mode, ki podpira 2^20 naslovov samo z enim 16 bitnim registrom nisi mogel dostopati do več kot 64K naslovov. Zato so uvedli segmentacijo, fizični naslov je bil tako sestavljen iz segment:offset dela. En primer:
segment = 0x1000, offset = 0x0FFF
naslov = segment * 16 + offset => 0x10000 + 0x0FFF= 0x10FFF

Isti naslov bi dobil, če bi recimo vzel za segment 0x10FF in offset 0x000F. Ker se s segmentacijo v real mode da naslovit naslove nad 2^20, so se naslovi wrappal v naslov 0, dokler niso uvedli A20 linije. V protected mode segmentni register vsebuje indeks do GDT/LDT tabele, kjer se vzame base address in se mu prišteje offset. Dans nimaš več segmentacija, ker maš flat model. Boljš in bolj slikovito razloženo glede segmantacije v real/protected mode-ih maš razloženo tu.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

nf_conntrack in TIME_WAIT

Oddelek: Pomoč in nasveti
61091 (656) jedateruk
»

C in funkcije ter #define

Oddelek: Programiranje
463969 (2330) misek
»

Firefox vrača 64-bitno verzijo za Windows

Oddelek: Novice / Brskalniki
279042 (6969) techfreak :)
»

Navidezni pomnilnik

Oddelek: Šola
133427 (3027) B & O
»

kde in resolucija

Oddelek: Operacijski sistemi
101530 (1398) moj_nick

Več podobnih tem