VCPI, DPMI, V86 a další
                             -=-=-=-=-=-=-=-=-=-=-=-=-

      All parts should go together without forcing. You must remember that
      the parts you are reassembling were disassembled by you. Therefore,
      if you can't get them together again, there must be a reason. By all
                          means, do not use a hammer.
                        -- IBM maintenance manual, 1925

          Přesto, že strašáci jako EMS, XMS, UMB, HMA atd zmizeli, situace
      není až tak růžová. Microsoft s Intelem nám přichytali další.

          Protože DOS o protected  módu neví,  nejpřirozenější  způsob jak
      pod ním provádět  protectedmódový  program je k němu  přidat  nějaký
      zavaděč,  který  se  napřed  postará  o  nastolení  protected  módu.
      To samo o sobě znamená vyplnění  několika  tabulek, vypnutí A20 gate
      a přepnutí procesoru. Není to nic strašného.

          Průšvih ale je, že DOS i BIOS je pouze 16ti bitový a v 32bitovém
      protectedmódovém  prostředí prostě nepoběží. Proto by takový program
      už nemohl ani na disk.  Intelové  kvůli tomu  udělali  režim  jménem
      V86. To je režim  procesoru, kdy se procesor  tváří,  jako kdyby byl
      v normálním  (reálném)  režimu, ale přesto je v protected módu. Tedy
      real modový  program (DOS a BIOS) běží, ale program  zprostředkující
      protected  mód (v tomto  případě to tedy  není  systém)  nad nimi má
      stejnou  kontrolu,  jako  nad  normálním  procesem v protected  módu
      dokonce  včetně  virtuální   paměti.  Tento  režim  například  bežně
      používají i programy  jako  EMM386,  nebo  QEMM pro  emulaci  okénka
      do EMS. Nevýhodou tohoto režimu je, že ne všechny instrukce procesor
      zvládá  sám a některé se  musí  emulovat  (podobně  jako  koprocesor
      na 286). Tyto instrukce pak běží  samozřejmě  pomalu.  Mezi ně patří
      většina  instrukcí,  které jsou  normálně  privilegované a protected
      módovy  program si je nemůže  dovolit - například  cli a sti.  Proto
      16ti bitové  programy pod V86 jsou pomalejší a navíc v emulaci mohou
      být chyby. Pro většinu věcí to ale stačí.

          Musí se ale emulovat i interrupty a proto jsou systémová  volání
      pracující hlavně s interrupty  docela pomalá. Je také nutné data pro
      ně připravit do nějakého  transfer  bufferu, aby náhodou nebyly mimo
      dolních  640 KB. Proto  přístup k disku pod protected  módem  hlavně
      v případě, že přistupujete po malých kouscích je výrazně  pomalejší.
      32 bitový  přístup k disku pod Windows  dělá  přesně  to, že nahradí
      DOSová  volání  pro práci s diskem 32 bitovým  kódem a tak se ušetří
      několik  přechodu  mezi  protected a V86 módem při  přístupu k disku
      (volá se jenom BIOS).  Nejedná se tedy o opravdový 32 bitový přístup
      (že by se IDE řadič krmil 32 bitovými čísly - což je také možné.

          V  případě,  že  toto  všechno  vyřešíte,  pořád  není  vyhráno.
      Privilegovaný  program  řídící  protected  mód musí být totiž  pouze
      jeden. Jak jsem už říkal,  EMM386 a Qemm tento mód využívají a proto
      váš  program  se pod  nimi  proste  nespustí.  Při  pokusu o přechod
      do  protected  modu  zkolabuje.  K  tomu  vzniklo   rozšíření  VCPI.
      V případě, že je VCPI  server v paměti,  nepoužijete  standardní kód
      pro inicializaci  protected  módu, ale požádáte VCPI server, aby vám
      předal  řízení. Ten to udělá a vy tak získáte  kontrolu.  Nakonec ji
      zase předáte zpátky.

          Aby  toho  ale  nebylo  málo,  jednou  se  Bill  špatně   vyspal
      a vymyslel  Windows. Ty jsou také od verze x.y v protected módu, ale
      VCPI nepodporujou.  Ztratily by totiž možnost provádět  multitásking
      v případě, že předají  řízení.  Proto  byl  vytvořen  nový  standard
      jménem  DPMI. DPMI  znamená DOS protected mode  interface. To DOS je
      zcela  zcestné,  protože z DOSem  nemá nic společného.  Jinak je ale
      název docela vpořádku.

          Jedná se o jakýsi  ovladač, který na daném  interruptu  (podobně
      jako  třeba  ovladač  myši)  zpřístupňuje  nejběžnější  věci,  které
      protected  módový  program dělá  (přepni do proteted  módu,  zavolej
      realmodový interrupt, práce s virtuální pamětí atd...)

          32 bitový  program  tedy pak nepotřebuje  svůj  vlastní  kód pro
      inicializaci  protected  módu,  V86  apod.  Prostě a jednoduše  volá
      DPMI. Aby to ale  nebylo tak snadné,  DPMI  bylo  navrženo  pro 286,
      která už měla  jakýsi  protected  mód, ale tak zvoraný, že ho stejně
      nikdo  nepoužíval.  Díky  tomu má DPMI  mnoho  omezení.  Navíc  DPMI
      neběží na všech  počítačích a proto  program  stejně musí mít i jiné
      cesty k  inicializaci.  Existuje  několik  verzí  DPMI a díky  velké
      komplikovanosti  standardu  jsou skoro  všechny  implementace  nějak
      zbugované.

          Pokud ale běží zrovna  dobrý DPMI  server, máte lineární  paměť,
      možnost  mapovat si co chcete,  volat realmodové  interrupty a další
      věci, což většinou stačí k životu. Jedna z největších  komplikací je
      pouze naprosto  zbytečné omezení na velikost zásobníku  (zásobník se
      musí určit na začátku).  Normálně (v Linuxu apod.) to vypadá  trochu
      jinak.  Zásobník  je na  konci  adresovatelného  prostroru,  zatímco
      halda na začátku a rostou tedy proti sobě.  Paměť se procesru  předá
      až v případě, že k ní poprvé  přistoupí, proto  program  nepotřebuje
      na začátku několik GB paměti.  Program má potom vpodstatě  neomezený
      zásobník a haldu.

          DPMI  tedy  není  nikterak  dobrý  standard,  ale jde  používat.
      Protože ho mají v API Windowsy i OS/2 asi se jen tak něčeho  lepšího
      v Billových a podobných systémech nedočkáme.


            výheň