Adresace
                                  -=-=-=-=-=

      "If a computer can't directly address all the RAM you can use, it's
                                  just a toy."
               -- anonymous comp.sys.amiga posting, non-sequitir

          Běžně se v programech  čísla  větší,  než 65536 moc  nevyskytují
      a proto 32 bitů  moc  důležitých  není.  Jedno z míst,  kde  opravdu
      pomůže je adresace. 64KB paměti  adresovatelných 16ti bytovým číslem
      je prostě  málo.  Proto se  vývojáři  od  intelu  hluboce  zamysleli
      a vymysleli segmenty.

          Celou paměť rozdělili po 64KB blocích.  Adresace  potom  probíhá
      tak, že zvolíte  segment,  který určuje blok a teprve  potom offset,
      který určuje vlastní  pozici v segmentu. Je tak tedy možné adresovat
      mnohem  více  paměti.  Určování  všech  adres  nadvakrát by ale bylo
      pomalé a proto se rozhodli použít segmentové registry. Každý program
      má nastavený  například registr CS (code segment). Pozice v programu
      se  prostě  potom  určuje  pomocí   jednoho  16ti  bitového   čísla,
      které  určuje  offset v segmentu  CS.  Podobně  funguje  registr  DS
      (data  segment) pro data a další registry.  Všechno  funguje  dobře,
      pokud  program není delší, než 64KB a nepoužívá více dat. V případě,
      že program je delší, je nutné  používat  jinou  instrukci pro skoky,
      volání  apod,  které  používají  plné  adresy   (segment  i  offset)
      a podobně u dat. Tyto instrukce jsou ale zase pomalejší.

          BC se s tímto vypořadává zavedením  nekolika  pamětových modelů.
      Jeden  extrém  je  small,  kde  jsou  všechny  adresy  krátké a není
      tedy  možné  míd  data či kód  delší,  než  64Kb a v druhém  extrému
      jsou zase všechny  adresy  dlouhé a kód je potom  delší a pomalejší.
      Máte ale k dispozici celou  paměť.  Většinou se ale používají  různé
      hybridní  modely,  kde  některá  data  jsou  blízko  a jiná  daleko.
      K tomu se používají dva typy ukazatelů. Do C je potom  nutné  přidat
      slovíčka far a near, pomocí  kterých se rozlišuje mezi těmito  typy.
      Je také třeba víceméně zdvojit  memorymanagement,  zavédst farmalloc
      pro alokaci  vzdálených dat apod. I funkce přebírající jako parametr
      ukazatel by měly  být ve dvou  verzích - pro  far i near  ukazatele.
      Také se tím rozbije pointerová  aritmetika - není možné míchat far a
      near ukazatele. Prostě začne tím opravdové peklo.

          Ale  Intelové  toto  ještě  zdokonalili. U XT použili  pouze pár
      prvních  bitů v  segmentu  jako  adresu a  proto  XT  umí  adresovat
      pouze  640KB  paměti.  To  ale  brzo  začalo  být  málo a  proto  se
      do XT začaly  přidávat  hardwarové  paměti  EMS,  které  ale  nebyly
      běžně  adresovatelné. Bylo z nich vidět  pouze  okénko 64KB a pomocí
      speciálního   ovladače  se  určovalo,   kterou  část  paměti  okénko
      zobrazuje.  Paměť tak byla pomalejší a práce s ní byla komplikovaná,
      ale alespoň nějaká byla.

          Korunu  tomu všemu  narazila 286. Zde intelové  přišli na to, že
      640KB paměti je málo, Rozhodli se proto zvětšit velikost  segmentové
      adresy.  Protože  ale  XT  paměť  "wrapovali"  (tedy  aresa  1  bylo
      to samé co adresa 640KB+1),  přestaly by fungovat nějaké hypotetické
      obskurdní   aplikace   přisupující   na adresu 1 pomocí  té   delší.
      Vymysleli tedy šílenost jménem A20 gate (ten zmíněný  ignorovaný bit
      je právě 21.).  Program  používající více, než 640KB RAM tedy napřed
      A20 gate  zapne a potom může  adresovat  dál.  Běřně je ale A20 gate
      vyplá a proto naše hypotetická aplikace by mohla dál fungovat myslíc
      si, že je na XT.

          To by ale  nebylo  tak  strašné  jako  to, že  existuje  několik
      způsobů  přepínaní této brány.  Dobrý ovladač je musí všechny  znát.
      Bežně se o ně stará v dosu  HIMEM.SYS.  Proto po jeho  zavedení máte
      k dispozici věc, co se jmenuje HMA (high memory  area). Což je právě
      místo nad 640KB, kde lze normálně  provádět kód, pokud je A20 zaplá.
      Bežně si tam sobecky vleze DOS a nikoho jiného tam nepustí.

          286 ale už umí adresovat 16MB  paměti  dokonce  pomocí  několika
      berliček  (himemu) ji i používat.  Pracuje se s ní samozřejmě  úplně
      jinak, než z přímo  adresovatelnou  dolní  pamětí,  nebo  EMS. Proto
      programy musí znát ještě další způsob jak pristupovat do paměti.

          Snad Vás potěším, že právě 32 bitů toto  řeší. 32 bitová  adresa
      je dost dlouhá na to, aby adresovala celou  paměť.  Proto není třeba
      dělat  žádné  segmenty,  offsety,  XMS,  EMS, UMB, HMA,  far,  near,
      paměťové  modely a další  strašáky.  Prostě  pokud  je jednou  paměť
      pořádně  zinicalizována  (to není tak jednoduché, už třeba  díky A20
      gatím), je možné pomocí  jednoduché  32bitové adresy určit libovolné
      místo v paměti stejně  rychle, jako v případě small modelu v reálném
      módu.

          Díky  tomu  můžete na vše co se  týká  těchto  věcí  zapomenout.
      Ve zdrojácích  smazat  všechna slova far a near a radovat se z toho,
      že máte  lineární  paměť.  Navíc tím padá omezení na velikost  polí,
      protože už není řádný  důvod, aby pole byla  omezena na 64KB.  Proto
      vám už nemusí naskočit  virážka, pokud budete potřebovat  nahrát 2MB
      dat do paměti.  Není nutné  kvůli tomu  psát  nějaké  ovladače  XMS.
      Prostě dáte malloc a je to :)

          Další věc, která odpadá jsou overlaye. Protože velikost programu
      už není  omezena  volnou  dolní  pamětí,  můžete  klidně  odělat 2MB
      program, aniž by bylo nutné ho nějak rozsekávat na kousky.


            výheň