80x86 memóriakezelés
2010-01-06T09:12:05+01:00
2010-01-07T12:20:07+01:00
2022-06-29T09:20:42+02:00
  • És volt még az EMS: egy 64KB-s 'ablakban' 4 darab 16KB-s darabban lehetett az 1MB feletti memóriát elérni valós módban, először csak hardver segítségével, azután 386-tól pusztán szoftverrel is
    Mutasd a teljes hozzászólást!
  • 80x88-ból mindössze egyetlen féle létezett, a 80188-as, de az sohasem terjedt el a piacon. A 80186-os sem.

    Ami pedig a 80x86-ot illeti, nem kellene azokat mind egy kalap alá venni.

    A 80286 még 16 bites processzor volt, max 16 mega memóriát tudott címezni, és 64k szegmens határ volt (protected módban is). A 80386-os pedig már 32 bites volt, és 4 giga fizikai memória határra tervezték, amit egyetlen szegmenssel is át tudott fogni.
    Mutasd a teljes hozzászólást!
  • Találtam is ezzel kapcsolatban egy érdekes történetet.
    Mutasd a teljes hozzászólást!
  • De sőt, majdnem 64KB-t használhatunk az 1MB felett is, ha a hardverünk is engedi, ez a HMA, FFFF:0010 - FFFF:FFFF (= 100000 - 10FFEF). (Ha a hardverünk nem engedi, akkor persze a memória legelejét látjuk viszont ezeken a címeken,)
    Mutasd a teljes hozzászólást!
  • A szegmentált címzést annak idején azért találták ki, mert a 8088-as processzornak 16 bites regiszterei voltak és 20 címvonala. Hagyományos címzéssel csak 16 bites címeket tudott volna tárolni a regisztereiben, amely 64K memória elérését tette volna lehetővé.

    Ennek a problémának a megoldására találták ki, hogy a fizikai címeket 16 bites szegmens és 16 bites offszet logikai címekkel határozzák meg, melyeket már el lehet tárolni a processzor regisztereiben.

    Az elképzelésed jó, valóban átlapolják egymást a szegmensek, tehát egy fizikai címet többféleképpen is felírhatunk logikai címekkel.

    Egy példa:

    Legyen egy logikai cím A000:0000.

    Ebből úgy kapunk fizikai címet, hogy a szegmens címet balra léptetjük 4 bittel (16-tal szorozzuk), majd hozzáadjuk az ofszet címet:

    A000 << 4 = A0000 és A0000 + 0000 = A0000.

    Most nézzük meg az A000:FFFF logikai címet:

    A000 << 4 = A0000 és A0000 + FFFF = AFFFF.

    A két fizikai cím különbsége: AFFFF - A0000 = FFFF.

    Tehát egy szegmens valóban FFFF bájt, azaz 64K.

    Most vizsgáljuk meg az A001:0000 logikai címet:

    A001 << 4 = A0010 és A0010 + 0000 = A0010.

    Mivel A0010 - A0000 = 10, vagyis 16 bájt, így a szegmensek valóban 16 bájtonként lapolódnak át (vigyázat: nem 16K, hanem 16 bájt).

    Végül arra kell még figyelni, hogy ezzel a címzési móddal a maximálisan megcímezhető memória:

    FFFF:000F, vagyis FFFF0 + 000F = FFFFF, vagyis 1M.

    Itt találhatsz még bővebb információt a 8088-as processzorról.
    Mutasd a teljes hozzászólást!
  • Túlbonyolítod, pedig már magától is túl bonyolult. Húszbites címet állítanak elő kétszer tizenhat bitből, mégpedig úgy, hogy az első rész (szegmens) tizenhattal szorozzák, és ahhoz hozzáadják a másodikat (offszet).
    Mutasd a teljes hozzászólást!
  • Forditva. 8086 modban egy 20 bites cimbusz van, es 16-val maradek nelkul oszthato cimeken kezdodnek a szegmensek. Magyarul a segment:offset cim az segment*16 + offset modon szamolodik "fizikai" cimme. Nincs olyan, hogy "fizikai szegmens", ez csak memoriacimzesi eljaras.

    Tom
    Mutasd a teljes hozzászólást!
  • Sziasztok

    A 80x86 CPU-k memóriakezelésével kapcsolatban szeretnék egy kis felvilágosítást kérni. Utánaolvastam a dolognak, mert eddig nem teljesen volt világos a számomra.
    -A 80x88 processzorok szegmens:offszet címzést használnak, minden szegmens 64kbyte.
    Ezt úgy értelmeztem, hogy az egész memória -pl legyen a gépben 32Mb- mondjuk egy csomag A4-es lap, és minden egyes lap egy 64kbyt-nyi területet jelent.
    -Minden 16 kbyt-nél egy új szegmens kezdődik. Na itt már egy kicsit kavar van. Ha jól értem itt arról lenne szó, hogy a legelső A4-es lapra úgy teszük rá a következőt, hogy a tetejénél maradjon ki mondjuk 10 cm??? Így a második lap, az elsőnek majdnem a 75%át lapolná át? Viosszatérve a 80x88 hoz. Tehát egy szegmensnyi területet 4 szegmens lapol át? Az első szeg 16k nál, a második 32k-nál, a harmadik 48k nál, a negydik pedig 64k nál, azaz a 0. szegmens végénél kezdődik... Ez így rendben van-e, vagy valamit félreértelmeztem?
    Még az nem világos, hogy ha fizikai címet akarunk számolni, akkor minek kell szorozni 16-al a szegmenst, meg osztani az offszettel, jobbra léptetni, meg 0 kal feltölteni???


    Előre is köszönöm a válaszokat
    Mutasd a teljes hozzászólást!
abcd