Forum » Strojna oprema » 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!
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:
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.
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | nf_conntrack in TIME_WAITOddelek: Pomoč in nasveti | 1091 (656) | jedateruk |
» | C in funkcije ter #defineOddelek: Programiranje | 3969 (2330) | misek |
» | Firefox vrača 64-bitno verzijo za WindowsOddelek: Novice / Brskalniki | 9042 (6969) | techfreak :) |
» | Navidezni pomnilnikOddelek: Šola | 3427 (3027) | B & O |
» | kde in resolucijaOddelek: Operacijski sistemi | 1530 (1398) | moj_nick |