Johdanto
Osoitteenmuuntotoiminnolla varustetussa tietokoneessa pääsykäskyn antamaa osoitetta (operandi) kutsutaan loogiseksi osoitteeksi tai suhteelliseksi osoitteeksi. Todellinen tehollinen osoite sisäisessä muistissa, eli fyysinen osoite, saadaan laskemalla tai muuntamalla osoitemoodia.
Eri tietokoneiden osoitetila (osoitteenmuunnostoiminto) on erilainen. Kun kirjoitat ohjelmaa assembly-kielellä, sinun tulee ensin tutustua tämän koneen ohjejärjestelmään.
Viitekirjan selitys
1. Osoitteenmuuntotoiminnolla varustetussa tietokoneessa pääsykäskyn antamaa osoitetta (operandi) kutsutaan loogiseksi osoitteeksi, jota kutsutaan myös suhteelliseksi osoitteeksi. Fyysinen osoite sisäisessä muistissa saadaan laskemalla tai muuntamalla osoitemoodia.
2. Käyttäjäohjelmassa käytettyä osoitetta kutsutaan suhteelliseksi osoitteeksi tai loogiseksi osoitteeksi.
3. Looginen osoite koostuu kahdesta 16-bittisestä osoitekomponentista, joista toinen on segmentin perusarvo ja toinen on offset. Molemmat komponentit on koodattu allekirjoittamattomilla numeroilla.
Akateemisen kirjallisuuden selitys
1. Tällä tavalla tallennusyksikön osoite voidaan esittää segmentin perusosoitteella (segmentin osoite) ja segmentin sisäisellä offsetilla (offset-osoite). Perusosoite määrittää sen segmentin sijainnin, jossa se sijaitsee koko tallennustilassa, ja offset määrittää sen sijainnin segmentissä. Tätä osoiteesitystä kutsutaan loogiseksi osoitteeksi, ja se ilmaistaan yleensä muodossa segmenttiosoite: offset-osoite.
2. Ns. loogisella osoitteella tarkoitetaan datan loogisen lohkonumeron antamaa levyn sijaintia (l lohko = 512 sanaa l sana = 64 bittiä) ja fyysisen osoitteen määrää levyn sylinteri ja pää. , Segmentti ja muut osoitteen määrittämät fyysiset sijainnit.
Taustaa
Lähdettä tarkasteltaessa Intelin 8-bittisessä tietokoneen 8080CPU:ssa on 8-bittinen dataväylä (DB) ja 16-bittinen osoiteväylä (AB). Sitten tämä 16-bittinen osoitetieto on myös välitettävä 8-bittistä dataväylää pitkin, ja se tallennetaan myös datakanavan scratchpadiin ja CPU:n rekistereihin ja muistiin, mutta koska AB on täsmälleen kokonaisluku DB:n monikerta, joten ristiriitoja ei tule!
Mutta kun se päivitettiin 16-bittiseksi koneeksi, Intel8086/8088CPU:n suunnittelu ei voinut ylittää 40 nastaa IC-integrointitekniikan ja ulkoisen pakkaus- ja pin-tekniikan rajoitusten vuoksi. Mutta mielestäni 8-bittisen koneen alkuperäinen osoituskyky 2^16=64KB on liian pieni, mutta se kasvaa suoraan 16:n kokonaislukukerrannaiseksi, vaikka AB=32-bittiä ei saavutettaisi. Näin ollen AB voidaan vain tilapäisesti kasvattaa 4:llä 20:een. Tällöin osoituskapasiteettia 2^20=1MB on kasvatettu 16-kertaiseksi. Mutta tämä on aiheuttanut ristiriidan AB:n 20-bitin ja DB:n 16-bitin välillä. 20-bittistä osoitetietoa ei voida siirtää DB:ssä, eikä niitä voida tallentaa 16-bittiseen CPU-rekisteriin ja muistiyksikköön. Näin syntyi CPU-segmentin rakenteen periaate.
Lineaarinen osoite
Looginen osoite koostuu kahdesta osasta, segmentin tunnisteesta ja segmentin poikkeamasta. Segmentin tunniste koostuu 16-bittisestä kentästä, jota kutsutaan segmentin valitsimeksi. Ensimmäiset 13 numeroa ovat indeksinumero. Lainausmerkit voidaan ymmärtää taulukon alaindeksinä - ja se vastaa taulukkoa. Mikä indeksi se on? Tämä on "segmentin kuvaaja". Segmenttikuvaajan tarkka osoite kuvaa segmenttiä (sanan "segmentti" ymmärtäminen: voimme ymmärtää, että virtuaalimuisti on jaettu segmentteihin. Esimerkiksi muistissa on 1024 Se voidaan jakaa 4 segmenttiin, jokaisessa segmentissä on 256 tavua). Tällä tavalla monet segmenttikuvaajat ryhmitellään taulukkoon nimeltä "segmenttikuvaustaulukko". Tällä tavalla tietty segmenttikuvaaja löytyy suoraan segmenttikuvaustaulukosta segmenttitunnisteen 13 ensimmäisen bitin kautta. Kuvaaja kuvaa segmenttiä. Segmentin abstraktio juuri nyt ei ollut tarkka, koska katsomalla, mitä kuvaajassa on – eli miten se on kuvattu, voit ymmärtää, mitä segmentissä on. , Jokainen segmenttikuvaaja koostuu 8 tavusta, kuten kuvassa 1:
Nämä asiat ovat hyvin monimutkaisia, vaikka tietorakennetta voidaankin määrittää sen määrittelemiseen, mutta välitän tässä vain yhdestä asiasta, joka on Base Field, joka kuvaa segmentin aloituspaikan lineaarista osoitetta.
Intelin suunnittelun alkuperäinen tarkoitus on, että jotkin globaalit segmenttikuvaajat sijoitetaan "Global Segment Descriptor Table (GDT)" -taulukkoon ja jotkut paikalliset, kuten kunkin prosessin omat, sijoitetaan ns. paikalliseen segmenttiin. Kuvaajataulukko (LDT)". Joten milloin minun pitäisi käyttää GDT:tä ja milloin minun pitäisi käyttää LDT:tä? Tämä ilmaistaan segmentinvalitsimen T1-kentällä, =0 tarkoittaa GDT:n käyttöä ja =1 tarkoittaa LDT:n käyttöä.
Muistissa olevan GDT:n osoite ja koko tallennetaan CPU:n gdtr-ohjausrekisteriin, kun taas LDT on ldtr-rekisteriin.
Monet käsitteet, kuten kielenkääntäjät. Kuva 2 näyttää intuitiivisemmalta:
Ensin, kun annetaan täydellinen looginen osoite [segmentin valitsin: offset-osoite segmentin sisällä],
1, katso segmenttivalitsinta T1=0 tai 1, tiedä onko nykyinen muunnos segmentti GDT:ssä vai LDT:ssä ja hanki sitten sen osoite ja koko vastaavan rekisterin mukaan. Meillä on joukko.
2. Poista segmentin valitsimen 13 ensimmäistä bittiä. Löydät vastaavan segmentin kuvaajan tästä taulukosta, niin että se on Base, eli kantaosoite.
3, Base + offset on muunnettava lineaarinen osoite.
Aiheeseen liittyvät erot
Looginen osoite (Looginen osoite) viittaa offset-osoitteen osaan, joka liittyy ohjelman luomaan segmenttiin. Kun esimerkiksi teet C-kielen osoitinohjelmointia, voit lukea itse osoitinmuuttujan arvon (& toiminto). Itse asiassa tämä arvo on looginen osoite, joka on suhteessa nykyisen prosessisi datasegmentin osoitteeseen, eikä se liity absoluuttiseen fyysiseen osoitteeseen. . Vain Intelin reaalitilassa looginen osoite on sama kuin fyysinen osoite (koska todellisessa tilassa ei ole segmentointi- tai hakumekanismia, CPU ei suorita automaattista osoitteen muuntamista); logiikka on poikkeama koodisegmentin rajan sisällä ohjelman suorittamisessa Intelin suojatussa tilassa Shift-osoite (olettaen, että koodisegmentti ja datasegmentti ovat täsmälleen samat). Sovellusohjelmoijien tarvitsee käsitellä vain loogisia osoitteita, ja segmentointi- ja hakumekanismi on täysin läpinäkyvä sinulle ja vain järjestelmäohjelmoijat osallistuvat siihen. Vaikka sovellusohjelmoijat voivat itse manipuloida muistia suoraan, he voivat käyttää vain käyttöjärjestelmän sinulle varaamaa muistisegmenttiä. Lineaarinen osoite (Lineaarinen osoite) on välikerros loogisen osoitteen ja fyysisen osoitteen muuntamisen välillä. Ohjelmakoodi luo loogisen osoitteen tai offset-osoitteen segmentissä sekä vastaavan segmentin perusosoitteen lineaarisen osoitteen muodostamiseksi. Jos hakumekanismi on käytössä, lineaarinen osoite voidaan muuntaa fyysisen osoitteen luomiseksi. Jos hakumekanismi ei ole käytössä, lineaarinen osoite on suoraan fyysinen osoite. Intel 80386:n lineaarisen osoiteavaruuden kapasiteetti on 4G (2-32 potenssi on 32 osoiteväylän osoitus).
Fyysinen osoite (Physical Address) viittaa osoitesignaaliin, joka näkyy suorittimen ulkoisessa osoiteväylässä fyysisen muistin osoittamiseksi, ja se on osoitteen muuntamisen lopullinen osoite. Jos hakumekanismi on käytössä, lineaarinen osoite muunnetaan fyysiseksi osoitteeksi käyttämällä sivuhakemiston ja sivutaulukon merkintöjä. Jos hakumekanismi ei ole käytössä, lineaarisesta osoitteesta tulee suoraan fyysinen osoite.
Virtuaalimuisti viittaa siihen, että tietokoneen esittämä muisti on paljon suurempi kuin todellinen muisti. Joten sen avulla ohjelmoijat voivat kääntää ja suorittaa ohjelmia, joissa on paljon suurempi muisti kuin todellisessa järjestelmässä. Tämä mahdollistaa monien suurten projektien toteuttamisen järjestelmissä, joissa on rajalliset muistiresurssit. Erittäin sopiva analogia on: sinun ei tarvitse pitkää rataa päästäksesi junaan Shanghaista Pekingiin. Tarvitset vain tarpeeksi pitkiä kiskoja (esim. 3 kilometriä) suorittaaksesi tämän tehtävän. Käytetty menetelmä on laskea kiskot taakse junan etuosaan välittömästi. Niin kauan kuin toimintasi on riittävän nopeaa ja täyttää vaatimukset, juna voi kulkea kokonaisena radana. Tämä on tehtävä, joka virtuaalisen muistin hallinnan on suoritettava. Linux 0.11 -ytimessä jokainen ohjelma (prosessi) on jaettu virtuaaliseen muistitilaan, jonka kokonaiskapasiteetti on 64 Mt. Siksi ohjelman looginen osoitealue on 0x0000000 - 0x4000000.
Joskus kutsumme loogisia osoitteita myös virtuaalisiksi osoitteiksi. Koska se on samanlainen kuin virtuaalimuistitilan käsite, looginen osoite on myös riippumaton todellisesta fyysisestä muistikapasiteetista.
Loogisen osoitteen ja fyysisen osoitteen välinen "aukko" on 0xC0000000, mikä johtuu siitä, että virtuaaliosoite -> lineaarinen osoite -> fyysisen osoitteen kartoitus on täsmälleen erilainen kuin tämä arvo. Tämän arvon määrittää käyttöjärjestelmä.