﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="/index.xsl"?>
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Mikrokernelek</title><link href="/_sweb4/main.css" rel="stylesheet" type="text/css" /></head><body>
<div style="margin: 0px auto; width: 985px;" id="menudiv">
  <!-- Menü -->
  <ul class="menu" id="menu">
    <li>
      <a href="#" class="menulink">Informatika</a>
      <ul>
        <li>
          <a href="#" class="sub">Nyílt forrás</a>
          <ul>
            <li class="topline">
              <a href="http://www.egalizer.hu/informatika/nyilt/lnw.htm">A Linux nem Windows</a>
            </li>
            <li>
              <a href="http://new.egalizer.hu/a-katedralis-es-a-bazar/">A katedrális és a bazár</a>
            </li>
          </ul>
        </li>
        <li>
          <a href="#" class="sub">Zárt forrás</a>
          <ul>
            <li class="topline">
              <a href="http://new.egalizer.hu/what-is-the-matrix/">What is the Matrix?</a>
            </li>
          </ul>
        </li>
        <li>
          <a href="#" class="sub">Történelem</a>
          <ul>
            <li class="topline">
              <a href="http://www.egalizer.hu/informatika/tortenelem/commodore.htm">Commodore</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/informatika/tortenelem/szszgep.htm">Személyi számítógépek</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/informatika/tortenelem/x86cpu.htm">PC processzorok</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/informatika/tortenelem/archi.htm">Számítógép-architektúrák</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/informatika/tortenelem/geos.htm">GEOS</a>
            </li>
          </ul>
        </li>
        <li>
          <a href="#" class="sub">Esszék</a>
          <ul>
            <li class="topline">
              <a href="#" class="sub">Joel on Software</a>
              <ul>
                <li class="topline">
                  <a href="http://www.egalizer.hu/informatika/joel/gui.htm">Felhasználói felületek</a>
                </li>
              </ul>
            </li>
            <li>
              <a href="http://www.egalizer.hu/informatika/essze/mkernel.htm">Mikrokernel</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/informatika/essze/hasznalat.htm">A gép használata</a>
            </li>
            <li>
              <a href="http://new.egalizer.hu/linux-vagy-windows/">Linux vagy Windows?</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/informatika/essze/javabytecode.htm">Java bájtkód</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/informatika/essze/javagc.htm">Java szemétgyűjtő</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/informatika/essze/java/java8.htm">A Java 8 újdonságai</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/informatika/essze/mbrgpt.htm">Az MBR-től a GPT-ig</a>
            </li>
          </ul>
        </li>
        <li>
          <a href="#" class="sub">Tesztek</a>
          <ul>
            <li class="topline">
              <a href="http://www.egalizer.hu/informatika/tesztek/winteszt.htm">Melyik a gyorsabb?</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/informatika/tesztek/kindle.htm">Amazon Kindle</a>
            </li>
          </ul>
        </li>
      </ul>
    </li>
    <li>
      <a href="#" class="menulink">Tudomány</a>
      <ul>
        <li>
          <a href="#" class="sub">Atomerőművek</a>
          <ul>
            <li class="topline">
              <a href="http://www.egalizer.hu/tudomany/atom/baleset.htm">Atomerőmű balesetek</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/tudomany/atom/19ev.htm">Csernobil 19 évvel később</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/tudomany/atom/csernobil.htm">Csernobil</a>
            </li>
          </ul>
        </li>
        <li>
          <a href="#" class="sub">Űrkutatás</a>
          <ul>
            <li class="topline">
              <a href="http://www.egalizer.hu/tudomany/urkutatas/voyager.htm">A Voyager szondák</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/tudomany/urkutatas/voyagercomp.htm">A Voyager-ek számítógépe</a>
            </li>
          </ul>
        </li>
      </ul>
    </li>
    <li>
      <a href="#" class="menulink">Szárazföld</a>
      <ul>
        <li>
          <a href="#" class="sub">Lamborghini</a>
          <ul>
            <li class="topline">
              <a href="http://www.egalizer.hu/szarazfold/egyeb/lambo/gt.htm">350 GT/400 GT</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/szarazfold/egyeb/lambo/miura.htm">Miura</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/szarazfold/egyeb/lambo/countach.htm">Countach</a>
            </li>
          </ul>
        </li>
        <li>
          <a href="#" class="sub">Munkagépek</a>
          <ul>
            <li class="topline">
              <a href="#" class="sub">Dömperek</a>
              <ul>
                <li class="topline">
                  <a href="http://new.egalizer.hu/terex-titan/">Terex Titan</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/szarazfold/munkagepek/domper/cat797/cat797.htm">Caterpillar 797</a>
                </li>
              </ul>
            </li>
            <li>
              <a href="#" class="sub">Kotrógépek</a>
              <ul>
                <li class="topline">
                  <a href="http://www.egalizer.hu/szarazfold/munkagepek/kotrogep/muskie.htm">Big Muskie</a>
                </li>
              </ul>
            </li>
          </ul>
        </li>
        <li>
          <a href="#" class="sub">Építmények</a>
          <ul>
            <li class="topline">
              <a href="#" class="sub">Épületek</a>
              <ul>
                <li class="topline">
                  <a href="http://www.egalizer.hu/szarazfold/epitmeny/epulet/rekord/rekord.htm">Magassági rekordok</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/szarazfold/epitmeny/epulet/taipei101/taipei101.htm">Taipei 101</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/szarazfold/epitmeny/epulet/petronas/petronas.htm">Petronas tornyok</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/szarazfold/epitmeny/epulet/swfc/swfc.htm">SWFC</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/szarazfold/epitmeny/epulet/hins/hins.htm">Home Insurance</a>
                </li>
              </ul>
            </li>
            <li>
              <a href="#" class="sub">Tornyok</a>
              <ul>
                <li class="topline">
                  <a href="https://new.egalizer.hu/osztyankino-tv-torony/">Osztyankino TV-torony</a>
                </li>
                <li>
                  <a href="https://new.egalizer.hu/eiffel-torony/">Eiffel torony</a>
                </li>
              </ul>
            </li>
            <li>
              <a href="#" class="sub">Egyéb</a>
              <ul>
                <li class="topline">
                  <a href="http://www.egalizer.hu/szarazfold/epitmeny/egyeb/tenna.htm">Antennák</a>
                </li>
                <li>
                  <a href="https://new.egalizer.hu/akashi-kaikyo-hid/">Akashi Kaikyo</a>
                </li>
              </ul>
            </li>
          </ul>
        </li>
        <li>
          <a href="#" class="sub">Vasút</a>
          <ul>
            <li class="topline">
              <a href="http://new.egalizer.hu/sinkanzen/">Sinkanzen</a>
            </li>
            <li class="topline">
              <a href="http://www.egalizer.hu/szarazfold/vasut/nagyseb.htm">Nagy sebességű vonatok</a>
            </li>
          </ul>
        </li>
        <li>
          <a href="#" class="sub">Egyéb</a>
          <ul>
            <li class="topline">
              <a href="http://www.egalizer.hu/szarazfold/egyeb/wind.htm">Big Wind</a>
            </li>
          </ul>
        </li>
      </ul>
    </li>
    <li>
      <a href="#" class="menulink">Zene</a>
      <ul>
        <li>
          <a href="#" class="sub">Esszék</a>
          <ul>
            <li class="topline">
              <a href="http://new.egalizer.hu/paul-hindemith-zene-es-erzelem/">Zene és érzelem</a>
            </li>
            <li>
              <a href="http://new.egalizer.hu/arthur-honegger-a-jelen-es-a-jovo-kilatasai/">A jövőről</a>
            </li>
            <li>
              <a href="http://new.egalizer.hu/benjamin-britten-palyamrol/">Pályámról</a>
            </li>
          </ul>
        </li>
        <li>
          <a href="#" class="sub">Zeneszerzők</a>
          <ul>
            <li class="topline">
              <a href="#" class="sub">Wolfgang Amadeus Mozart</a>
              <ul>
                <li class="topline">
                  <a href="http://new.egalizer.hu/mozart-porosz-vonosnegyesei/">Porosz vonósnégyesek</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/zene/zeneszerzok/mozart/zvers.htm">Fortepiano versenyek</a>
                </li>
                <li>
                  <a href="http://new.egalizer.hu/utazas-a-jupiterre/">Utazás a Jupiterre</a>
                </li>
              </ul>
            </li>
            <li>
              <a href="#" class="sub">Joseph Haydn</a>
              <ul>
                <li class="topline">
                  <a href="http://new.egalizer.hu/a-szimfonia-szuletese/">A szimfónia születése</a>
                </li>
              </ul>
            </li>			
            <li>
              <a href="#" class="sub">Bartók Béla</a>
              <ul>
                <li class="topline">
                  <a href="http://new.egalizer.hu/bartok-bela-oneletrajz/">Önéletrajz</a>
                </li>
                <li>
                  <a href="http://new.egalizer.hu/szamomra-minden-nap-bartok-evfordulo/">Évforduló</a>
                </li>
              </ul>
            </li>
            <li>
              <a href="#" class="sub">Gustav Mahler</a>
              <ul>
                <li class="topline">
                  <a href="http://new.egalizer.hu/ket-es-fel-perc-csond/">Két és fél perc csönd</a>
                </li>
              </ul>
            </li>
            <li>
              <a href="#" class="sub">Ludwig van Beethoven</a>
              <ul>
                <li class="topline">
                  <a href="http://www.egalizer.hu/zene/zeneszerzok/beethoven/kilenc.htm">Kilencedik szimfónia</a>
                </li>
              </ul>
            </li>
            <li>
              <a href="http://www.egalizer.hu/zene/zeneszerzok/webern.htm">Anton Webern</a>
            </li>
          </ul>
        </li>
        <li>
          <a href="#" class="sub">Karmesterek</a>
          <ul>
            <li class="topline">
              <a href="#" class="sub">Wilhelm Furtwängler</a>
              <ul>
                <li class="topline">
                  <a href="http://www.egalizer.hu/zene/karmesterek/furtw.htm">Bevezetés</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/zene/karmesterek/furtw2.htm">Furtwängler élete</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/zene/karmesterek/furtw3.htm">Furtwängler lemezen</a>
                </li>
                <li>
                  <a href="http://new.egalizer.hu/friedrich-schnapp/">Friedrich Schnapp</a>
                </li>
              </ul>
            </li>
            <li>
              <a href="#" class="sub">Willem Mengelberg</a>
              <ul>
                <li class="topline">
                  <a href="http://www.egalizer.hu/zene/karmesterek/mengel.htm">Columbia felvételek</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/zene/karmesterek/mengel_opk.htm">Opus Kura lemezek</a>
                </li>
              </ul>
            </li>
          </ul>
        </li>
        <li>
          <a href="http://new.egalizer.hu/cd-velemenyek/">CD vélemény</a>
        </li>
        <li>
          <a href="#" class="sub">Sorozatok, kiadók</a>
          <ul>
            <li class="topline">
              <a href="http://www.egalizer.hu/zene/kiado/greatcon.htm">Great Conductors</a>
            </li>
          </ul>
        </li>
        <li>
          <a href="http://www.egalizer.hu/zene/librettok/librettok.htm">Szövegkönyvek</a>
        </li>
      </ul>
    </li>
    <li>
      <a href="#" class="menulink">High Fidelity</a>
      <ul>
        <li>
          <a href="#" class="sub">Esszék</a>
          <ul>
            <li class="topline">
              <a href="http://www.egalizer.hu/hifi/esszek/zenehifi.htm">A zene és a hifi</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/hifi/esszek/termtorz.htm">A HiFiről</a>
            </li>
            <li>
              <a href="http://new.egalizer.hu/a-high-end-rol/">A High End</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/hifi/esszek/modszer.htm">Módszerek és csapdák</a>
            </li>
            <li>
              <a href="http://new.egalizer.hu/a-digitalis-kihivas/">A digitális kihívás</a>
            </li>
            <li>
              <a href="http://new.egalizer.hu/loudness-unit-cd-adatbazis/">Hangosság adatbázis</a>
            </li>
          </ul>
        </li>
        <li>
          <a href="http://new.egalizer.hu/sajat-rendszerem/">Saját rendszer</a>
        </li>
        <li>
          <a href="#" class="sub">Salvatore</a>
          <ul>
            <li class="topline">
              <a href="http://www.egalizer.hu/hifi/highend/bev.htm">Bevezetés</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/hifi/highend/tortenet.htm">Történetem</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/hifi/highend/kereskedelem.htm">Kereskedelem</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/hifi/highend/lemezek.htm">Hanglemezek</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/hifi/highend/filo.htm">Filozófiám</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/hifi/highend/magazin.htm">Magazinok</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/hifi/highend/lp12.htm">Linn Sondek</a>
            </li>
          </ul>
        </li>
        <li>
          <a href="#" class="sub">Hangtechnika</a>
          <ul>
            <li class="topline">
              <a href="http://www.egalizer.hu/hifi/hangtechnika/tda1541/tda1541.htm">TDA1541</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/hifi/hangtechnika/resta/resta.htm">Restaurálás</a>
            </li>
            <li>
              <a href="http://new.egalizer.hu/cd-sacd-dvd-audio/">Formátumok</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/hifi/hangtechnika/zfelv.htm">A zenei felvételekről</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/hifi/hangtechnika/nagyfel/nagyfel.htm">A nagy felbontásról</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/hifi/hangtechnika/futomuvek.htm">CD futóművek tesztje</a>
            </li>
          </ul>
        </li>
        <li>
          <a href="#" class="sub">Történelem</a>
          <ul>
            <li class="topline">
              <a href="http://www.egalizer.hu/hifi/tortenelem/cd.htm">A Compact Disc</a>
            </li>
            <li>
              <a href="http://new.egalizer.hu/pcm-felvetelek/">Az első PCM felvételek</a>
            </li>
            <li>
              <a href="http://www.egalizer.hu/hifi/tortenelem/gramo.htm">Gramofónia</a>
            </li>
            <li>
              <a href="http://new.egalizer.hu/solti-ringje-es-a-bitrata/">Solti Ringje és a bitráta</a>
            </li>
          </ul>
        </li>
        <li>
          <a href="#" class="sub">Készülékek</a>
          <ul>
            <li class="topline">
              <a href="http://new.egalizer.hu/magyar-hi-fi-keszulekgyartok-listaja/">Magyar gyártók</a>
            </li>
          </ul>
        </li>
      </ul>
    </li>
    <li>
      <a href="#" class="menulink">Irodalom</a>
      <ul>
        <li class="topline">
          <a href="#" class="sub">Írók</a>
          <ul>
            <li class="topline">
              <a href="http://new.egalizer.hu/rejto-jeno-szomoru-elete/">Rejtő Jenő</a>
            </li>
            <li>
              <a href="http://new.egalizer.hu/olaf-stapledon-elete/">Olaf Stapledon</a>
            </li>
          </ul>
        </li>
        <li>
          <a href="http://new.egalizer.hu/a-kepes-kronika/">Képes Krónika</a>
        </li>		
      </ul>
    </li>
    <li>
      <a href="#" class="menulink">Tárgyak</a>
        <ul>
            <li class="topline">
              <a href="#" class="sub">Kockák a négyzeten</a>
              <ul>
                <li class="topline">
                  <a href="http://www.egalizer.hu/szarazfold/egyeb/kockak1.htm">Az őskor</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/szarazfold/egyeb/kockak2.htm">A hőskor 1.</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/szarazfold/egyeb/kockak3.htm">A hőskor 2.</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/szarazfold/egyeb/ajandek.htm">Ajándék- készletek</a>
                </li>
              </ul>                  
            </li>			
            <li>
              <a href="#" class="sub">Karórák</a>
              <ul>
                <li class="topline">
                  <a href="http://www.egalizer.hu/szarazfold/egyeb/eichi2.htm">Eichi 2</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/szarazfold/egyeb/orakar.htm">Rejtett költségek</a>
                </li>
                <li>
                  <a href="https://new.egalizer.hu/udvozlet-japanbol/">Üdvözlet Japánból</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/targyak/orak/kings.htm">A King Seiko története</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/targyak/orak/king1.htm">Az első King Seiko</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/targyak/orak/57gs.htm">Az második Grand Seiko</a>
                </li>
                <li>
                  <a href="http://www.egalizer.hu/targyak/orak/cosc.htm">A COSC röviden</a>
                </li>
                <li>
                  <a href="http://new.egalizer.hu/regi-seiko-arlistak/">Régi Seiko árlisták</a>
                </li>
              </ul>                  
            </li>			
        </ul>
    </li>
    <li>
      <a href="#" class="menulink">Névjegy</a>
      <ul>
        <li>
          <a href="http://www.egalizer.hu/nevjegy.htm">Bemutatkozás</a>
        </li>
        <li>
          <a href="http://www.egalizer.hu/szakdoga.htm">Krónikás</a>
        </li>
        <li>
          <a href="http://www.egalizer.hu/letolt.htm">Letöltés</a>
        </li>
        <li>
          <a href="http://www.egalizer.hu/linkek.htm">Linkek</a>
        </li>
      </ul>
    </li>
    <li>
      <a href="https://new.egalizer.hu" class="menulink" style="border-right: 1px solid #909090;">Kezdőlap</a>
    </li>
  </ul>
  <!-- Menü vége -->
</div>

<p id="sweb_elements">
    <object id="footer">
        Copyright (C) 2002 Páli Gábor János
    </object>
    <object id="buttons">
        <button title="tartalombutton" />
    </object>
</p>
<h3 title="Forrás">Operációs rendszerek 2 (I2201) előadás, Debreceni Egyetem TTK</h3>
<h2>Előszó</h2>
<p class="bekezd">
  Lépni kell. Fejlődni kell. És ezt bizony az operációs rendszerek kernelei sem kerülhetik el (egykönnyen). A
  monolitikus struktúra több, mint 32 éve uralja az operációs rendszerek birodalmát. Az utóbb 8-16 évben már 
  történtek kísérletek a továbblépésre (Mach, Exokernel), de eddig még senki sem tudott felmutatni jelentős eredményt.
  Kivéve talán egy-két rendszert: ilyen többek között a BeOS, QNX és az L4. Érdeklődésem középpontjába az L4 került,
  mivel fejlesztői teljesen felforgatták az eddig elméleteket és a forráskódját is felszabadították. A szabad
  rendszerek zászlóshajója, a &quot;talán egyszer majd elkészülő&quot; GNU HURD is nemrég rávetette magát az L4-re,
  talán azért is kapták fel ilyen hirtelen...
</p>
<h2>Monolitikus a rendszer?</h2>
<p class="bekezd">
  A monolitikus szervezési modell az egyik legrégebbi elv az operációs rendszerek kernelei megvalósításában. Mint
  tudjuk, a kernel feladata az operációs rendszeren belül a legfontosabb: talán ezért is fordulhatott elő, hogy
  adódtak olyan rendszerek is az évek folyamán, amik öntörvényűen a kernelről nevezték el magukat.
</p>
<p class="bekezd">
  Mi is a kernel feladata? Rengeteg dolgot kell szolgáltatnia egy mai monolitikus felépítésű kernelnek, például ő
  ismeri az operációs rendszer által támogatott összes állományrendszert (file system - fs), hardverelemet (az 
  eszközmeghajtókon keresztül), az ütemezési algoritmusokat, a kommunikációs lehetőségeket. Számos dolog tartozik
  tehát egy kernel hatáskörébe, de ez már nevében is benne van, hiszen ezért nevezzük monolitikusnak. Ennek ellenére
  egy kernel még nem operációs rendszer, hiszen hiányoznak belőle azok a lehetőségeket, amelyek segítségével például
  magával a felhasználóval képes kapcsolatot teremteni. Kompetens módon nem képes alkalmazások lefordítására sem, 
  és magától szinte semmire sem. Irányításra van szüksége. Mint az elején is említettem, ez egy nagyon régóta méglévő
  elképzelés (tehát mindent egyetlen állományba kell csoportosítani), és közel harminc éves uralomra tekint vissza. 
  (Az első UNIX rendszerek megszületésétől egészen napjaink UNIX-áig: *BSD, Linux, stb.)
</p>
<p>Röviden nézzük meg, milyen előnyökkel jár, ha valaki ilyen típusú rendszert fejleszt:</p>
<ul>
  <li>a kernel mindenhez hozzáfér: az összes kernel-összetevő egyetlen címterületen helyezkedik el, és ezek a
  legmagasabb (processzor)privilégium szinten vannak;</li>
  <li>bármely apró hiba végzetes lehet a kernelre;</li>
  <li>minden optimizáció megengedett: a komponensek tetszőleges kapcsolatban vannak egymással, &quot;le lehet vágni 
  a kanyarokat&quot;, ezáltal egy (azért valamennyire) szabályozatlan, ámde relatíve gyors rendszert kapunk (majd 
  később meglátjuk, hogy ez nagyon fontos dolog!);</li>
  <li>mindenféle technika, megoldás könnyedén implementálható: bármi is jutna eszünkbe, szinte gond nélkül bele 
  tudjuk írni a kernelbe. Ehhez nem kell mást tenni, csak mondjuk létrehozni egy új rendszerhívást, és hozzá
  implementálni az új funkciót;</li>
  <li>az előbbiből következik, hogy a kernel bővítése nem áll másból, csak még több kód hozzáadásából;</li>
</ul>
<p class="bekezd">
  Ha ezek alapján tekintjük a Linux 2.4.18-as verziójának forrásszövegét, akkor az kb. összesen 2,7 millió sorból áll.
  Ebbe természetesen beleértendők a különböző meghajtóprogramok, az összes komponens (állományrendszerek, 
  memóriakezelés, ütemezés, üzenetek, I/O) forrása. De ez mind hozzátartozik ahhoz a méretes tar.gz vagy éppen
  tar.bz2 file-hoz (~15-20 MB), amit egy ilyen kernel frissítésekor letöltünk.
</p>
<p class="bekezd">
  A monolitikus rendszerek természetesen a korral azért fejlődtek is, hiszen kialakultak alverziói, amelyek bizonyos
  más rendezési elveknek megfelelően egy alstruktúrát is létrehoztak:
</p>
<ul>
  <li>rétegelt kernelek: a kernel szintekre van osztva, amelyek egymásra épülnek; az adott szint funkcióit csak a 
  felsőbb szintekről lehet elérni, alsóbb szintekről viszont nem;</li>
  <li>moduláris kernelek: a kernel bizonyos részei modulokként vannak megvalósítva, amelynek például előnye, hogy nem
  kell feltétlenül az összes modulnak a memóriában lennie, tetszőlegesen tölthetőek be és távolíthatóak el. 
  Ez nagyban javítja a rendszer rugalmasságát, hiszen így nem kell sem újrafordítani, sem felesleges (de néha mégis
  szükséges) komponensekkel terhelni a kész kernelt;</li>
  <li>objektum-orientált kernelek: az egyik legújabb elgondolás, amely az 
  OO-világ szabályait veszi alapul, és az eddigi tradícionális elvárások helyett 
  a rendszer magja valamilyen OO-nyelven íródik (a &quot;sima&quot; monolitikus kernelek 
  ugyebár többnyire eljárás-orientált nyelvben vagy gépikódban);</li>
</ul>
<h3 title="Felirat">Akkor vegyük egy monolitikus rendszer felépítését:</h3>
<p class="kozep"><img alt="kep1" src="/informatika/essze/kernel_1.gif" /></p>
<h2>A miniatürizálás csodái</h2>
<p class="bekezd">
  Miután már nagyjából tudjuk, hogyan néz ki egy &quot;átlagos&quot; rendszer (azért tegyük hozzá, hogy az IBM AIX
  rendszere, ill. egy másik nagyon ismert cég sorozata már (valamennyire) mikrokerneles szerkezetű!), feltehetnénk a
  kérdést, hogy miért van szükség erre a kavarásra, miért kell felrúgni több évtizedes, bevált módszereket. Nos, a
  legegyszerűbb válasz talán az lenne, hogy az informatika hihetetlenül dinamikus &quot;iparág&quot;, és még rengeteg
  fejlesztenivaló fekszik benne; és vannak olyan emberek, akik ebben látják a fejlődést.
</p>
<p class="bekezd">
  Akármennyire is tűnik egy ilyen rendszer kényelmesen kódolhatónak és gyorsnak (mondjuk, gyors is), számos (néha 
  igenis létfontosságú) dolog még mindig hiányzik egy monolitikus kernelből:
</p>
<ul>
  <li>egy átlagos ember (esetleg programozó) számára nem látható át a rendszer (elsőre), nincsenek elkülönített 
  egységek a modulokon kívül;</li>
  <li>a rendszerfunkciók ugyanabban a címterületben futnak, ugyanolyan privilégiumokkal: elérhetik egymás adatait, 
  egy helytelenül megírt kód veszélyezteti a rendszer egészét (és számos hiba okozója!);</li>
  <li>az egész kernelt egyetlen &quot;cég&quot; szállítja, nem &quot;keresztezhető&quot; más cégek szolgáltatásáival,
  hiszen hiányoznak a &quot;falak&quot; a szolgáltatások között (esetleg foltozgathatóak, de így a stabilitás veszélybe kerül);</li>
  <li>a kernel funkciói csak korlátozott módon bővíthetőek a futási idejében (legfeljebb a modulokat cserélgethetjük),
  és minden egyes frissítés esetén a rendszert újra kell fordítani, ill. a számítógépet újra kell indítani (ez 
  utóbbi a komolyabb szerverek esetében komoly kiesésnek számíthat, hiszen ha csak a Linuxot vesszük alapul, akkor
  gyakran kéthetente jön ki újabb verzió... ezért sem terjedt el az igazán éles rendszereken! - de miért fordítanánk 
  újra kedvenc Linuxunkat? Mert pl. lyukas, mint a szita!), egy modern szerver évente 
  legfeljebb csak 20 percet áll!</li>
</ul>
<p class="bekezd">
  Nyilván ki lehetett találni, hogy a modern mikrokernelek a fenti kritériumoknak megfelelnek, de mégsem annyira 
  elterjedtek - bár napjainkban már létezik egy feltörekvő változatuk, illetve kereskedelemben is kaphatóak (mint 
  pl. a QNX). Egyetlen hátrányuk van, hogy lassúak (egy monolitikus rendszerhez képest, majd meglátjuk, miért), de az 
  utóbbi időben már sikerült ezt a korlátot is az 5%-os határ alá szorítani (mindenféle kernelen kívüli specializáció nélkül!).
</p>
<h3 title="Felirat">Akkor hogyan is épül fel egy mikrokernel:</h3>
<p class="kozep"><img alt="kep2" src="/informatika/essze/kernel_2.gif" /></p>
<p class="bekezd">
  Mint ahogy láthatjuk is, a mikrokernel sokkal kevesebb komponenst tartalmaz. Az elnevezés is innen származik, nem
  pedig a méretéből, hiszen az ettől független (bár többnyire kisebb is, mint monolitikus társai). Így a benne 
  elérhető szolgáltatások száma is sokkal kevesebb, pl. a L4-es mikrokernelben csak 7(!) rendszerhívás van (szemben a
  monolitikus kernelek talán százas(?) nagyságrendjével).
</p>
<p class="bekezd">
  Az ábrán egy új elem is megjelenik, a szerver: ez adja a mikrokernelek 
  tényleges funkcionalitását, egy szerver tesz lehetővé egy felhasználó is 
  elérhető funkciót (pl. FAT32 típusú állományrendszer elérése), amely úgy működik 
  akár egy normális UNIX folyamat: elindítható, leállítható, vagy akár újra is 
  indítható. Ezekben (a mikrokernel kevés funkciója és a szerverek alkalmazása) 
  rejlik az igazi erő és lehetőség: a monolitikus kerneleknél &quot;bedrótozottnak 
  tekinhető&quot; rendszerhívások bármelyike helyettesíthető egy-egy szerverrel, pl. a 
  még a memóriakezelés is (egy ún. &quot;memóriaszerverrel&quot;).
</p>
<p class="bekezd">
  Ezek a szerverek párhuzamosan futnak egymás mellett, mint folyamatok. 
  Az egész mikrokerneles filozófiát tekinthetjük OO-nak is: ha a szervereket 
  objektumoknak tekintjük, amelyek üzenetekkel kommunikálnak egymással. Ez a 
  legkézenfekvőbb módszer, hiszen a szerverek nincsenek programozási nyelvhez 
  kötve, csupán egyetlen dologra, az ún. interfészre kell figyelnünk (hiszen 
  enélkül nem lehetséges a kommunikáció).
</p>
<p class="bekezd">
  Az interfészek esetében viszont van egy óriási segítsége a 
  programozónak, amit a Mach tervezőinek köszönhetünk: ez az interfész generátor. 
  Ez nem más, mint egy &quot;előfordító&quot;, amely a megírt programba behelyettesíti a 
  tényleges struktúrákat és függvényeket, amelyek elengedhetetlenül szükségesek. 
  Sőt, ennek továbbfejlesztett változata az L4-ben alkalmazott (ill. a utahi Flux 
  Research Group által is kutatott) IDL (Interface Definition Language), amely a 
  szerverek írását tovább egyszerűsíti; szinte gyerekjáték elkészíteni vele egy mikrokerneles rendszert.
</p>
<p class="bekezd">
  Igen, a mikrokerneles rendszerek másik előnye, hogy ha valaki készíteni 
  akar egy operációs rendszert, akkor rengeteg dolgot meg kell írni (de talán 
  feleslegesen, hiszen vagy léteznek már jobb implementációk, vagy pedig nincs is 
  tisztában, hogyan kellene kódolni az adott komponenst), a betöltésért felelős 
  rutinoktól (ebben azért sokat segít egy jó &quot;boot loader&quot; is, mint pl. a GRUB) 
  kezdve egészen a virtuális memória kezeléséig.
</p>
<p class="bekezd">
  Ezt régebben úgy oldották meg, hogy létrehoztak egy OSKit (Utahi 
  Egyetem) nevű programcsomagot, amely tartalmazta a legalapvetőbb rendszerkomponenseket (ezeket glue-nak, vagyis 
  &quot;tapasznak&quot; nevezte) a különböző  rendszerekből összeollózva. A célja az volt, hogy megkönnyítse az új
  operációs rendszerek fejlesztését: a fejlesztőknek kizárólag csak a lényegre kelljen koncentrálniuk; 
  ne vesszenek el a részletekben. Tetszőlegesen le lehet cserélni azt a komponenst, amelyiket újra akarjuk
  implementálni, vagy pedig bővíthetjük a rendszer a saját &quot;találmányainkkal&quot;.
</p>
<p class="bekezd">
  Nos, a Mach is erősen kihasználta az OSKit nyújtotta lehetőségeket, 
  talán ezért is lett ilyen robusztus. Viszont ha egy idealizált rendszert veszünk 
  (a rendkívül kicsi és kizárólag csak a lényeget tartalmazó L4-et), akkor az 
  lényegében fel tudja vállalni egyfajta &quot;OSKit-szerű&quot; funkciót, hiszen ha azt 
  vesszük, kapunk egy mikrokernelt, és minden komponensre egy-egy szervert 
  (amennyiben az ún. többszerveres megoldást alkalmazzuk). Amelyiket újra akarjuk 
  implementálni, az egyszerűen lecseréljük, és mindenféle újraindítás nélkül 
  kísérletezhetünk(!) pl. egy saját memóriakezelő megírásával. Sőt, a jövőben 
  talán lehetőségünk nyílik ezen komponensek futás idejű nyomkövetésére is! (A GNU 
  HURD rendszere elméleti síkon ezt a lehetőséget már támogatja, ill. 
  implementálta is a nemrég eldobott GNUMach-alapú sorozatban.) (Természetesen nem 
  kell sajnálni a monolitikus rendszerek fejlesztőit sem, hiszen a modern 
  számítógépek teljesítmények növekedésének köszönhetően már szinte mindegyiket 
  virtuális gépek alatt tesztelik, tehát mostanság már nekik sem kell újraindítani a rendszert...)
</p>
<p class="bekezd">
  Hogy továbbra is az OO-nál maradjunk, kifejtem az üzenetek fontosságát 
  is. Mint korábban említettem, a szerverek üzenetekkel kommunikálnak egymással. 
  Hozzá kell tenni, hogy igazából ezt üzenetváltásnak kellene nevezni, hiszen 
  ekkor mindig két üzenet keletkezik: az egyiket a küldő adja át a címzettnek 
  (mondjuk egy szerver-kliens modellben, tehát erre is utal a szerver elnevezés!), 
  ez lenne lényegében pl. egy esemény jelzése (&quot;Megszakítás történt!&quot;), vagy pedig 
  egy kérés (&quot;Foglalj nekem 100 KB memóriát!&quot;); a másik üzenet ennek megerősítése, 
  tehát egy visszajelzés arról, hogy a címzett megkapta az üzenetet. Ez 
  mindenképpen fontos, mert csak akkor &quot;vehetünk komolyan&quot; egy üzenetet, ha az meg 
  van erősítve! Ennek igazából nem is lenne jelentősége, ha mondjuk egyetlen 
  számítógépen futna az összes folyamat, hiszen egy ilyen inkonzisztenciát okozó 
  hardver- vagy szoftverhiba valószínűsége igen csekély (vagy bekövetkezésekor 
  maga a kernel is &quot;borulna&quot;). De mivel a szabály az szabály, ezért kötelező még 
  ekkor is válaszolni (sok esetben ez a folyamatok közötti szinkronizációt is szolgálja).
</p>
<p class="bekezd">
  Ellenben hihetetlenül fontos szerepe van egy ilyen válasznak abban az 
  esetben, ha mondjuk a rendszer funkciónak nem egyetlen processzoron, esetleg nem 
  is egyetlen számítógépen futnak! Ez már az osztott rendszerek témakörébe 
  kalauzol minket (ld. A.S. Tannenbaum Amoeba-ja, szerepel a történeti 
  áttekintésben is), de korántsem áll messze a mikrokernelektől. Hiszen ezáltal a 
  szervereket mindenféle külön támogatás nélkül valós időben is párhuzamosan 
  futatthatjuk; egyedül magának a mikrokernelnek kell támogatnia a több processzor 
  megfelelő kezelését, ill. a hálózatot. Meglepő, de ez az &quot;emberi szemléletmód&quot; 
  sokkal jobban definiálhatóbbá, jobban bővíthetőbbé teszi a mikrokerneleken 
  alapuló rendszereket. A lehetőségek (egyelőre) határtalanok: még rengeteg 
  kiaknázandó fegyvertényt rejt magában egy ilyen rendszer. De példák már léteznek:
</p>
<ul>
  <li>API (Application-Program Interface)-k használata: nincs megkötve a rendszer 
  által használt binárisok, tárgykódok formátuma, hiszen egy új szerver 
  elkészítésével akár egyetlen kernel alatt futatthatunk egy natív Java-s 
  programot és Linuxos binárisokat is, ezek lennének maguk az API-k; ismerik a 
  betöltés módját, elfogják az esetleges megszakításhívásokat, vagy akár egy 
  JVM-et szimulálnak (ehhez hasonló mechanizmus egy-két monolitikus kernelben is 
  előfordul, ott ABI (Application Binary Interface)-nek nevezik (így képes a 
  FreeBSD többek között natív Linuxos programok futtatására));</li>
  <li>állományrendszerek: erről már korábban esett szó, hiszen az talán nem is 
  annyira szokatlan, hogy több állományrendszert is képes támogatni a rendszer 
  egyszerre. Talán azért van mégis jelentősége, mert lehetőség adódik pl. a 
  pakolt állományrendszer (stack filesystem) egyszerűbb implementálására is, 
  vagy a leveleinket ezentúl nem a kedvenc levelezőprogramunkkal kezeljük, hanem egy szövegszerkesztővel egy ún.
  &quot;mailbox fs&quot;-en keresztül. Ez lényegében a levelesládánk absztakciója;</li>
  <li>személyiségek (personalities): nincs megkötve, hogy melyik felhasználó 
  milyen szervereket használ. Mindenki a saját bejelentkezése során olyan 
  funkciókat tölt be, amire van jogosultsága és kell neki. Lehetőség nyílik 
  felülbírálni az alaprendszer által nyújtott lehetőségeket: megváltoztatni az 
  ütemezés algoritmusát, a virtuális memória kezelését, a kölcsönös kizárást, 
  betölteni a használni kívánt binárisokhoz szükséges szervereket. Tehát minden 
  felhasználó tényleg más-más profilú operációs rendszert kap egyetlen kernel segítségével;</li>
  <li>rugalmasság és bővíthetőség: mivel a rendszer magja és a hozzá kapcsolódó 
  programok kicsik, így könnyen átvihető egyik hardvertípusról a másikra és csak 
  a kívánt szervereket kell hozzáadni vagy módosítani a rendszerben. A 
  módosításokat azonnal (&quot;online&quot;) ki is lehet próbálni;</li>
  <li>elszigetelés: a rendszer funkcióiban (tehát a szerverekben) bekövetkező 
  hibák ugyanúgy izolálhatóak, mint a bármely más alkalmazásban bekövetkező 
  hibák - a rendszer nem omlik össze, javítható marad;</li>
  <li>moduláris felépítés: a monolitikus kerneleknél is emlegetett modularitás 
  teljesen áthozható a mikrokernelek világába is;</li>
  <li>könnyű karbantartás, kevesebb hibalehetőség: mivel kisebb a rendszer 
  magja, ezért kevesebb hibát is lehet benne ejteni, illetve jobban felügyelni 
  lehet a fejlesztését. A karbantartása egyszerű, mert amint kialakul a 
  szabványa (sajnos az L4 esetében pl. a kivételkezelés még nincs teljesen 
  letisztázva), azokra implementálásra kerülnek és szinte alig kell hozzájuk nyúlni (= nincs újraindítás!);</li>
</ul>
<p class="bekezd">
  Az API-k és személyiségek támogatásával megszűnik egy másik probléma 
  is, amely napjaink operációs rendszereinek fejlődését akadályozza: ez az 
  alkalmazások hiánya. Ha egy rendszer nem kap elegendő támogatást (tehát nem 
  jelenik meg rá kellő számú felhasználói program), akkor szinte áshatja is a 
  saját sírját, hiszen a kutya sem fogja használni, legfeljebb egy-két megszállott 
  hacker. Az előbbi eszközökkel viszont áthidalható a probléma, mert nem kell 
  megvárni a &quot;honosított&quot; alkalmazásokat, illetve a rendszer sincs kötelezve saját 
  bináris formátum használatára (ami szintén időt vesz a tervezésből és a fejlesztésből).
</p>
<h2>Történeti áttekintés</h2>
<p class="bekezd">
  Jelenleg a mikrokernelek második generációja van fejlesztés alatt, de röviden nézzük is át, milyen elődökön
  keresztül vezetett az út; ezek az elődök milyen újításokkal voltak felszerelve.
</p>
<h3>Az első generációs mikrokernelek (1986-1993)</h3>
<p class="bekezd">
  <b>MACH</b>: a Carnegie-Mellon University (CMU) és az Open Source Foundation 
  (OSF) által fejlesztett kernel. Talán ez tekinhető az első (működő) 
  mikrokernelnek, ami a Kaliforniai Egyetem (UC) Berkeley-ben házaló Computer 
  Systems Research Group által kifejlesztett és megalapozott BSD architektúrából 
  építkezik. Erre később próbáltak is építeni egy BSD-típusú rendszert, amelyet 
  Lites-nek neveznek (napjainkban pedig egy új, open source változat is készülget, 
  az xMach; bár jelen pillanatban nem érhető el a website-juk).
</p>
<p class="bekezd">
  Annak ellenére, hogy robusztus kernelről van szó (igazából, mint első 
  nekifutásként egy monolitikus kernel leszűkítése), még most is használják a 4-es 
  verzióját (ezt viszont Utahban fejlesztik), és többek között a FSF (Free 
  Software Foundation) is elkészítette a saját Mach4 implementációját, GNUMach 
  néven (sajnos az 1.3-as verziónál abbamaradt a fejlesztés- őszintén megvallva 
  jobb is, mert a &quot;sima&quot; Mach4-nél is kuszább lett a kódja, mert tartalmazta a 
  Linux 2.0-ban előforduló meghajtók igen nagy részét, főleg a hálókártyákét; 
  amitől nem lett feltétlenül &quot;fitt&quot;).
</p>
<p class="bekezd">
  Elméleti jelentősége ott van, hogy a Mach alkalmazta először a külső lapozó (external pager) elvét (vagyis 
  lényegében a rendszerben menet közben is variálható memóriakezelést);
</p>
<p class="bekezd">
  <b>CHORUS</b>: a Sun saját mikrokerneles szárnypróbálgatása, Inria Chorus 
  nevéhez fűződik, a Machhal együtt az első kereskedelmi mikrokernelek egyike;
</p>
<p class="bekezd">
  <b>AMOEBA</b>: a Vrjje Universiteit (Hollandia) által fejlesztett mikrokernel. 
  Maga Andrew S. Tannenbaum professzor áll a hátterében, mint az korábban is 
  írtam, fő elméleti jelentősége az elosztott rendszerekben van, és a forráskódja is elérhető a szerző honlapjáról;
</p>
<p class="bekezd">
  <b>L3</b>: a szintén emlegetett L4 elődje, a GMD (German National Research 
  Center for Information Technology) fejlesztette ki. Elméleti jelentősége a 
  felhasználó szintű meghajtók (User Level Driver) alkalmazásában van;
</p>
<h3>A második generációs mikrokernelek (1994-napjainkig)</h3>
<p class="bekezd">
  <b>SPIN</b>: a Washingtoni Egyetem (UW) fejlesztette ki, itt szintén
  megfordul a külső lapozás lehetősége, és saját kernelfordítóval rendelkezik,
  amely lehetővé teszi, hogy a felhasználó által javasolt algoritmusokat be tudjuk
  építeni a rendszerbe: tehát egy átlagos felhasználó is képes rendszerhívásokat
  írni. Az ágak és a memóriahivatkozások felügyeletével a kernel megbizonyosodik
  róla, hogy újonnan generált kód nem sérti a kernel vagy a felhasználó
  integritását. A Spin a Machra alapozódik;
</p>
<p class="bekezd">
  <b>EXOKERNEL</b>: a Massachusetsi Műszaki Egyetem (MIT) készítette. A
  mikrokernel képes többszörözni a &quot;hardverprimitíveit&quot;, megbízható módon. 
  Jelenleg MIPS-en működik, és az feltevése, hogy nélkülöz minden absztrakciót: 
  csak ezeket az ún. &quot;hardverprimitíveket&quot; tartalmazza (bár vannak benne azért 
  eszközmeghajtók is). Ennek következményeképp az Exokernel erősen hardverfüggő. 
  Valahogy úgy lehet elképzelni az egészet, hogy a mikrokernellel felépítünk egy 
  interfészt a programok számára, ami nem túl bonyolult, inkább egy &quot;virtuális processzorhoz&quot; hasonlítható;
</p>
<h3>Az L4</h3>
<p class="bekezd">
  Az IBM és a GDM közös fejlesztése, közel egy évtizednyi kísérletezés 
  eredménye. Talán a Mach után ez az első olyan kernel, amelynek komolyan 
  gyakorlati jelentősége is van, ami a felhasználó szintű címtereket jelenti (User 
  Level Address Space). Az Exokernellel egyidős, és érdekessége (a jelentős 
  teljesítményért cserébe, amit kapunk), hogy csak 486-ostól felfelé támogatja a 
  x86-os architektúrát (tehát még Pentium, Pentium Pro, sőt tartalmaz Pentium4-re 
  is vonatkozó optimalizációkat!). De emellett létezik ARM és Alpha rendszerekre 
  is. Másik meglepő dolog, hogy tényleg apró: az ARM változat forrásszövege csupán 
  csak 6.000 sorból áll! Az egész igazándiból C++ és assembly kódrészletek 
  keverékéből áll, és így erősen objektum-orientált is.
</p>
<p class="bekezd">
  Én személy szerint az L4-et tartom a legmeggyőzőbb és a legkorszerűbb 
  mikrokernelnek. Ezért gondolom, hogy ha &quot;piacképesebb&quot; rálátást akarok adni a 
  problémákra, akkor a legújabb elméleteket kell elővenni. Természetesen ahol 
  szükséges, ki lesznek emelve a korábbi mikrokernelek hibái, megoldásai is. A 
  technikai megvalósításokba nem merészkednék bele; ez már jóval túlhaladná a 
  témakört, illetve szükséges lenne némi védett módú assemby-tudás is.
</p>
<p class="bekezd">
  Az L4 tehát három absztrakciós rétegből épül fel: címterek, szálak és a 
  kommunikáció. (Ezek összesen csak 12 KB-nyi kódot takarnak!) A Machnál közel 
  25-ször gyorsabb, legalábbis a legsarkallatosabb pont, a kommunikáció 
  tekintetében; illetve egy alapvető L4-es üzenetváltás még egy normális 
  UNIX-hívásnál is kétszer gyorsabb (viszont egy ilyen funkció megvalósításához 
  több üzenetváltásra van szükség - többnyire)!
</p>
<h3>A címterek</h3>
<p class="bekezd">
  A címtér nem más, mint &quot;logikai&quot; memória, egy szegmens. A fizikai 
  (tehát a gépben lévő) memóriát tudjuk vele felosztani; talán úgy kellene 
  elképzelni, mint egy halmazt. Ezeknek a halmazoknak értelmezett a metszetük is: 
  az a memóriterület, amit a két címtér megoszt egymást között (pl. kommunikáció 
  céljából). Maguk a címterek egy tetszőleges intervallumot képeznek a fizikai 
  memóriacímekből: az egyik kezdődhet a nullás (ún. lineáris) címtől, mint akár 
  egy másik is. A tényleges címekké való átkonvertálást az MMU végzi (a 
  processzorban). Ezek szolgáltatottak felváltani a Mach tervezése közben 
  elkövetett hibát: a külső lapozás szabályainak &quot;huzalozását&quot;. Mivel ez elég 
  komoly megszorítást jelent a teljesítmény szempontjából, ezt mindenképpen át 
  kellett lépniük a második generációs mikrokerneleknek. Tehát ahelyett, hogy a 
  kernel szabná meg a játékszabályokat, itt csak biztosítja az eszközöket ahhoz, 
 hogy kialakíthatóak legyenek a megfelelő szabályozások. Ezek az eszközök 
  megengedik a különböző védelmi sémák kialakítását, vagy akár a fizikai memória 
  kezelését is a &quot;kernel felett&quot;.
</p>
<p class="bekezd">
  Az ötlet a kernelen kívüli címterek rekurzív felépítésében rejlik. A 
  kezdeti címtér a fizikai memóriát reprezentálja és az első címtér-kezelő szerver 
  (szigma0) irányítása alá tartozik. A rendszer indulásakor a többi címtér tehát 
  még üres. A további címterek létrehozásához és karbantartásához (a kezdeti 
  címtéren) a mikrokernel három műveletet biztosít: az &quot;oda adás&quot; (grant), a 
  &quot;belapozást&quot; (map) és a &quot;kilapozást&quot; (demap, v. unmap, flush). Egy címtér 
  tulajdonosa (egy vagy több szál, ami az adott címtérben hajtódik végre) &quot;oda 
  adhatja&quot; bármelyik lapját bármelyik más címtérnek, biztosítva arról, hogy a 
  címzett elfogadja. Az &quot;oda adott&quot; lap végleg eltűnik az &quot;adományozó&quot; címteréből, 
  és megjelenik az &quot;adományozott&quot; címterében. Fontos, hogy a tulajdonos csak azok 
  a lapokat &quot;osztogathatja el&quot;, amelyet hozzá tartoznak. A tulajdonos 
  természetesen &quot;belapozhatja&quot; (mondhatjuk azt is, hogy &quot;kölcsön adhatja&quot;) saját 
  címterének lapjait, amennyiben azt a másik elfogadja. Miután ez megtörtént, mind 
  a két címtér tudja használni az immáron megosztott lapot. Tehát ellentétben az 
  &quot;oda adással&quot; a lap megmarad a tulajdonos címterében. Mint az &quot;oda adásnál&quot; is, 
  itt is csak azok a laphatók &quot;adhatók kölcsön&quot;, amelyeket a tulajdonos birtokol. 
  A tulajdonos &quot;vissza is veheti&quot; (vagyis &quot;kilapozhatja&quot;) a &quot;kölcsönadott&quot; 
  lapokat. A &quot;visszavett&quot; lap továbbra is elérhető marad a tulajdonos számára, de 
  minden más címtérből eltűnik, ahonnan az közvetlenül, vagy közvetve elérhető 
  volt. Bár ezen címterek tulajdonosainak explicit engedélyére nincs szükség, maga 
  a művelet mégis biztonságos, hiszen az egész le van korlátozva lapokra. A 
  &quot;kölcsönadott&quot; lapok használói már az elején beleegyeznek egy lehetséges 
  &quot;visszavételbe&quot;, amikor azt vagy &quot;kölcsön&quot; vagy pedig &quot;örökbe kapják&quot;.
</p>
<p class="bekezd">
  Mivel a lapozásokhoz szükséges az egyetértés a belapozó és a befogadó 
  között, ezért ezt az IPC (folyamatok közti kommunikáció) valósítja meg. A 
  címteres megoldás a memóriakezelést és a lapozást a mikrokernelen kívülre 
  helyezi; a kernelben csak a grant, map, demap funkciók találhatóak. A belapozás 
  és a kilapozás (map és demap) ahhoz szükséges, hogy memóriakezelőket tudjunk a 
  mikrokernel tetején létrehozni. Az &quot;oda adást&quot; (grant) pedig csak különleges 
  esetekben használják, hogy elkerüljék pl. a redundáns nyilvántartást, és a 
  címterek túlcsordulását. A külső lapozásos megvalósítással szemben a kernel 
  kizárólag csak a saját mechanizmusaira szorítkozik, a szabályokat pedig teljesen 
  a felhasználói szintű szerverekre hagyja. Ennek illusztrálására akár fel is 
  lehetne írni néhány ugyanilyen alacsonyszintű rendszerhívást, amelyek szintén 
  címtér-alapú szervereket használnak, amik pedig a kernel mechnanizmusain. Egy 
  szerver a kezdeti címteret kezeli, akár egy klasszikus memóriakezelő, de a 
  mikrokernelen kívül. A memóriakezelők könnyen ráépíthetők egymásra; az első 
  memóriaszerver belapozza, vagy elkéri a fizikai memória egy részét az 1-es 
  memóriaszervernek és a 2-es memóriaszervernek. Így már van két parallel memóriakezelőnk.
</p>
<p class="bekezd">
  Egy lapozó is beleépíthető a memóriakezelőbe vagy a memóriakezelést 
  végző szerverbe. A lapozók használják a mikrokernel által nyújtott grant, map, 
  demap primitíveket. A fennmaradó interfészek, a lapozó-kliens, a 
  lapozó-memóriaszerver teljesen az IPC-re épülnek és a kernelen kívül vannak 
  definiálva. A lapozók használhatóak a hagyományos lapozott virtuális memória 
  megvalósítására, vagy akár állományok/adatbázisok belapozására, úgy, mint 
  lapozatlan belső memóriának, amelyet a eszközmeghajtók vagy a multimédia 
  rendszerek is használnak.
</p>
<p class="bekezd">
  A felhasználó által definiált lapozási stratégiák lekezelése tehát 
  felhasználói szinten is történik, a mikrokernel részéről egyáltalán nincs 
  korlátozva. A multimédia és más valósidejű alkalmazások (tehát egy adott időn 
  belül feltétlenül választ várnak) úgy foglalják le a memóriát, hogy megjósolható 
  legyen a futási idejük. Például, a felhasználói szintű memóriakezelők és lapozók 
  megengedik a fizikai memória egy pontosan meghatározott szeletének legfoglalását, 
  vagy a memóriaterület zárolását (lock) egy adott ideig. Az ilyen multimédia és 
  időosztó erőforrás-foglalók a szerverek együttműködése által képesek létezni. Az 
  olyan memória-alapú eszközök, mint a bittérképes megjelenítők, megvalósíthatóak 
  egy memóriakezelő által, amelyik a képernyő-memóriát a saját címterében tárolja.
</p>
<h3>Egy konkrét címtér-típus: B/K</h3>
<p class="bekezd">
  Egy címtér tekinhető az eszköz-portok bejegyzéseinek természetes 
  absztrakciójaként. Ez teljesen magától adódik a memóriába leképzett B/K eszközök 
  esetén, de természetesen a B/K-portok is implementálhatóak. Az, hogy ezeket 
  mennyire lehet irányítani, az adott processzortól függ. A 386-os és utódai 
  például lehetővé teszik, hogy minden portot külön irányítsunk (egy nagyon kicsi 
  lap hozzárendelése minden porthoz), de nem lehet belapozni a portok címeit; a 
  PowerPC teljesen memóriába leképzett B/K-t használ, tehát a eszköz-portok 
  irányítása és belapozása 4 KB-os lapokkal történik. A B/K eszközökhöz tartozó 
  jogokat és az eszközmeghajtókat a mikrokernel alatt futó memórikezelők és 
  lapozók is képesek kezelni, tehát nem szükséges támogatás a kernel részéről.
</p>
<h3>A szálak és az IPC</h3>
<p class="bekezd">
  A szál egy tevékenység, ami egy adott címtérben zajlik. Egy &quot;tao&quot; szál 
  leírható regiszterek egy halmazával, ami legalább tartalmaz egy műveletmutatót (instruction 
  pointer), egy veremmutatót (stack pointer) és egy állapotinformációt (state 
  information).
</p>
<p class="bekezd">
  Egy szál állapotinformációja magában foglalja azt a &quot;szigma-tao&quot; 
  címteret, ahol a &quot;tao&quot; valójában végrehajtódik. A címterek dinamikus és statikus 
  hozzárendelése a döntő oka a szálak (vagy azzal ekvivalens) elvének alkalmazása 
  a mikrokernelekben.
</p>
<p class="bekezd">
  A címterek &quot;meghibásodását&quot; kivédve minden változás, ami a szál 
  címterében bekövetkezik, a kernel irányítása alatt kell állnia. Ebből 
  következik, hogy a mikrokernel tartalmaz valamiféle definíciót a &quot;tao&quot;-ra, amely 
  a fenti tevékenységet reprezentálja. Néhány operációs rendszerben lehetnek 
  további okok, hogy a szálakat mint az alapvető absztraktciós primitíveket 
  alkalmazza, pl. a preempció. Ebből következik, hogy a kernelnek támogatnia kell 
  a címterek közti kommunikációt, amit folyamatok közti kommunikációnak (IPC - 
  Inter-Process Communication) is neveznek. Ez a klasszikus módja a szálak közötti 
  üzenetek átadásának. Az IPC mindig feltételez egy &quot;hallgatólagos megegyezést&quot; 
  mind a két oldalán: a küldő eldönti, hogy üzenetet fog küldeni és tisztában van 
  annak tartalmával; a fogadó pedig eldönti, hogy fogadni akarja-e az üzenetet és 
  szabad kezet kap annak értelmezésében. Az IPC nem csak a legalapvetőbb kapcsolat 
  az alrendszerek között, de címterekkel együtt a függetlenség egyik alapköve. A 
  belapozás/kilapozás lényegében az IPC-hez szükségeltetik, mivel az szintén 
  igényli lapozó és lapozott kölcsönös beleegyezését.
</p>
<h3>Az IPC-k felügyelete</h3>
<p class="bekezd">
  A korábban már Yokote (1993) és Kühnhauser (1995) által is leírt 
  architektúrákban nem csak a memóriában elhelyezkedő elemeket kellett felügyelni, 
  hanem azok kommunikációját is. Ez mind a kommunikációs csatornák (communication 
  channels) vagy pedig a klánok (Clans) alkalmazásával megoldható.
</p>
<p class="bekezd">
  Az utóbbi módszert használja az L4, hiszen ez is az egyik újítása. A klánok lehetővé teszik az IPC-k figyelését a
  felhasználók által definiált szervereken keresztül. Ez egy nagyon gyors módszer, csak 2 (processzor)ciklust igényel IPC-nként.
</p>
<h3>Klánok</h3>
<p class="bekezd">
  Mielőtt rátérnénk a klánokra, nézzük meg, milyen megoldások léteznek 
  még. Például a biztonságot egy szabályzattal adjuk meg: minden felhasználó hozzá 
  tud férni minden objektumhoz; a szerverekhez való fizikai hozzáférés meg van 
  tiltva; a felhasználók csak a saját állományaikhoz férnek hozzá; a felhasználók 
  hozzá tudnak férni a saját állományaikhoz, annak a csoportnak az állományaihoz, 
  amiben vannak és a publikus file-okhoz (ez lényegében a UNIX módszere). Tehát 
  meg kell mondani azt, hogy ki (hitelesítés) mihez (felhatalmazás) férhet hozzá a rendszeren belül.
</p>
<p class="bekezd">
  Most lépjünk át arra a szintre, hogy a hozzáférést IPC-ken keresztül 
  valósítjuk meg. Ekkor felmerülhet a kérdés, hogy milyen mechanizmusokra van 
  szükség a hőn áhított biztonság realizálására; hogyan hitelesítsünk, hogyan fog 
  megjelenni a felhatalmazás, hogy adhatunk még további biztonsági szabályokat 
  hozzá, és ezek betartását hogyan tudjuk elérni. Felhatalmazást a 
  &quot;hamisíthatatlan&quot; szálazonosítókkal is megoldhatjuk, amelyek belapozhatóak mind 
  a taszkokhoz, felhasználókhoz, csoportokhoz, gépekre, tartományokra (domainekre). 
  Így az egész a kernelen kívülre kerül, és bármilyen szabályrendszer 
  megalkotható. Akkor vegyük hozzá a hitelesítést is. A szerverek ugyebár 
  objektumokat implementálnak; a klienseik IPC-n keresztül férnek hozzájuk. A 
  szerverek az IPC-n keresztül szintén &quot;hamisíthatatlan&quot; kliensidentitásokat 
  kapnak. A szerverek így képesek külső szabályokat is implementálni, és a 
  mikrokernelben ezt semmilyen belső mechanizmusnak nem kell támogatnia (továbbra sem).
</p>
<p class="bekezd">Vegyünk egy példát a fenti módszerre:</p>
<ul>
  <li>az objektumokhoz rendelt biztonsági szintek: szigorúan bizalmas, bizalmas, besorolt, be nem sorolt:
  SzB &gt; B &gt; bS &gt; bnS</li>
  <li>az alanyokhoz (felhasználókhoz) is az előbbi biztonsági szinteket rendeljük;</li>
  <li>egy S alany akkor olvashatja az O objektumot, ha: osztály(S) &gt;= osztály(O);</li>
  <li>egy S alany akkor írhatja az O objektumot, ha: oszály(S) &lt;= osztály(O);</li>
</ul>
<p class="bekezd">
  Ezzel létrehoztunk egy rendszert, amely a szerver-kliens kapcsolat 
  szempontjából garantáltan be fogja tartani a szabályokat, viszont arról nem 
  tudunk semmit, hogy a kliensek hogyan fogják cserélgetni az adatokat! Tehát 
  igenis szükség van olyan mechanizmusokra, amelyek nem csak megvalósítják a 
  szabályokat, hanem teljes mértékben be is tartják azokat. Ezeknek a 
  mechanizmusoknak pedig elég rugalmasnak kell lenniük ahhoz, hogy az összes 
  előforduló szabályt kezelni tudják.
</p>
<p class="bekezd">
  Az L4 rendszerben a kernel nem hitelesíti a kommunikációkat, de 
  lehetőséget ad a küldő azonosítására és megengedi, hogy bármelyik IPC-üzenet egy 
  másik folyamathoz legyen átirányítva. Ezen átirányítások definiálására használja 
  az L4 a &quot;klánok és vezérek&quot; (Clans &amp; Chiefs) modelljét. Ebben a modellben a 
  &quot;vezér&quot; egy megkülönböztetett folyamat egy klánon belül (ami pedig a folyamatok 
  egy (rész)halmaza). A klántagok vezérekhez való hozzárendelése az L4-ben 
  statikus. Bármilyen üzenetváltás, ami két tag között történik, azt a kernel 
  minden beavatkozás nélkül továbbítja. Viszont bármilyen kívülről beérkező és 
  kimenő üzenetet a kernel automatikusan átirányít az adott klán vezérének. A klán 
  feje, a vezér megvizsgálja az üzenetet (tehát a küldő és a fogadó azonosítóját, 
  illetve az üzenet tartalmát), és eldönti, hogy továbbadható-e a címzettnek. A 
  vezér akár módosíthatja is az üzenetet - teljes hozzáférést kap. A tagok pedig 
  megbíznak a vezérekben, ill. azok döntéseiben. A klánok segítségével helyi 
  vonatkozású monitorok és korlátozások vezethetőek be, és implementálhatóak a 
  kernelen kívül. Mivel a vezértaszkok felhasználói szinten futnak, ezért a 
  &quot;klán-elv&quot; sokkal kifinomultabb és a felhasználó által jobban definiálható 
  ellenőrzést tesz lehetővé, mint az aktív irányítás.
</p>
<p class="bekezd">
  Milyen hátrányai lehetnek ennek a modellnek? Az egész statikus: akkor 
  választhatjuk ki, hogy egy taszk melyik vezérhez tartozzon, amikor azt 
  létrehozzuk. Tehát, ha irányítani szeretnénk az IPC-ket, akkor mindig ki kell 
  jelölnünk egy vezért. Az általános esetben ez sokkal több üzenetváltás jelent, 
  és minden taszknak van saját vezére.
</p>
<h3>Az IPC-k átirányítása</h3>
<p class="bekezd">
  A klánok implementálásának egyik eszköze, amellyel a biztonsági 
  előírások betartását tudjuk teljes hatékonysággal elérni. Azokban a 
  rendszerekben, ahol címterekkel határolják a folyamatokat, ott minden, a 
  biztonságot érintő műveleteket IPC-ken keresztül valósítanak meg. Ezért az 
  IPC-hez kapcsolódó mechanizmusoknak rendelkezniük kell egy hatékony hozzáférési 
  szabályozással. De az fontos kikétel, hogy az ezzel járó többletmunkát 
  minimalizálni kell! Az L4 tehát olyan lehetőségeket kínál, amivel egy 
  &quot;megbízható&quot; folyamat dinamikusan képes &quot;IPC-ösvényeket&quot; kiépíteni szinte 
  elhanyagolható lassulással. A szabályok kötelező betartatása és az IPC sebessége 
  mindig is egy mikrokernel megalkotásának sarkos pontja. Egy ilyen rendszerben a 
  szolgáltatások felhasználói szinten vannak implementálva, és sok folyamat 
  kommunikációjára van szükség egyetlen taszk megvalósításához. A régebbi 
  mikrokernelekben, mint pl. a Mach, a kernel csak annyit szabályozott, hogy egy 
  folyamat képes-e a küldeni vagy éppen üzenet fogadni egy másik folyamatnak/tól. 
  A szerver-objektumok műveleteinek tényleges hitelesítését pedig maguknak a 
  szervereknek kell elvégezniük. Míg tehát a szervernek &quot;megbízhatónak&quot; kell 
  lennie a saját objektumainak irányításakor, de arra lehet nincs felkészítve, 
  hogy értelmezze és betartsa a rendszer biztonsági elvárásait. Ekkor többnyire 
  létezik még egy külön folyamat, amit hivatkozási monitor (reference monitor)-nak 
  hívnak, amelynek feladata a globális előírások betartatása.
</p>
<p class="bekezd">
  A legújabb mikrokernelekben Jochen Liedtke (L4) teljesen kivette a 
  kernelből a hitelesítést, ezzel is optimizálva az IPC-t. Ebben a rendszerben nem 
  hitelesíti a kapcsolatokat, de &quot;hamisíthatatlan&quot; forrásazonosítást kínál fel, és 
  megengedi, hogy bármelyik üzenetpár egy másik folyamatnak legyen átirányítható. (Ld. &quot;Klánok&quot;!)
</p>
<p class="bekezd">
  Ezeket az átirányításokat &quot;megbízató&quot; folyamatok irányítják, amiket 
  átirányítás-vezérlők (redirection controller)-nek nevezünk; feladatuk elvégezni 
  a hozzájuk tartozó folyamatok üzeneteinek átirányítását. Ezzel a mechanizmussal 
  le tudjuk kezelni az &quot;IPC-ösvényeket&quot;, tehát az egész rendszer biztonsági 
  szabályzata csupán pár üzenetváltással megoldható. Például egy &quot;IPC-ösvényt&quot; 
  kell csak figyelni kezdetben (monitorozni), de amint a monitor &quot;áldását adja 
  rá&quot;, az akár el is távolítható (amennyiben a biztonsági előírások lehetővé 
  teszik). Csak akkor kell újra beavatkoznia a kommunikációba a monitornak, amikor a szabályok megváltoznak.
</p>
<p class="bekezd">
  Ezzel a mechanizmussal párhuzamosan egy másik megoldás is született a 
  problémára, amit portál (portal)-nak neveznek. Egy portál nem más, mint egy 
  testreszabható IPC. Hasonlóan az átirányításhoz, a portálokat privilegizált 
  taszkok definiálják, és a kernel hívja meg minden IPC-kérésnél. A leírások 
  alapján portálok implementációjában szerepel egy portáltábla (portal table) a 
  kernelben, amiben sorban hivatkozásokat találunk a portálkódokra, amit a kernel 
  később végrehajt (tehát először minden portál &quot;megbízható&quot;).
</p>
<p class="bekezd">
  Az alapvető különbség az IPC-átirányítás és a portálok között, hogy a 
  portálok esetén a &quot;megbízható&quot; kód a kernel belsejében fut (annak címterében; 
  ami, mint tudjuk, privilegizált, akár a monolitikus kerneleknél!), míg az 
  átirányítás esetén általános mechanizmusok kerülnek meghívásra, tehát egyrészt 
  nem a felhasználónak kell megírnia a kódját, másrészt pedig (ami egyben a 
  legfontosabb) minden testreszabás a kernelen kívül implementálható (felhasználói címtérben)!
</p>
<p class="bekezd">
  Egyelőre még nem dőlt el, hogy melyik a módszer a &quot;nyerő&quot;, de azt már most is megállapíthatjuk, hogy az
  L4-nek sikerül szorosan tartani a saját és a biztonságos rendszerfelépítés elveit.
</p>
<p class="bekezd">
  Tekintsük át röviden, hogy milyen gondok léphetnek fel egy üzenet átirányításakor. Amikor elküldünk egy üzenetet 
  X-nek, akkor az a következő lehet: maga a cél; &quot;nem létező&quot;; egy köztes elem.
</p>
<p class="bekezd">
  Ha X maga a cél, akkor kapunk egy gyors kommunikációs kapcsolatot, és 
  szabadon információt cserélhetünk a céllal. Ha X nem létezik, akkor lényegében 
  akadályba ütközünk, ami lehetetlenné teszi a kommunikációt (IPC hiba). Ha X egy 
  köztes elem, akkor az lehet valamilyen biztonsági szabályzó (figyelő, elemző, 
  visszadobó, módosító), kommunikáció-könyvelő, vagy nyomkövető is. Ebben az 
  esetben nincs félnivalónk, a célhoz nagy valószínűséggel el fog jutni az üzenet 
  (amennyiben nem lesz eldobva), csak egy másik folyamaton keresztül. Ekkor pl. 
  &quot;álcázásra&quot; is lehetőségünk nyílik: a cél azt fogja hinni, hogy az üzenet a köztes elemtől érkezett.
</p>
<h3>Egy konkrét IPC-típus: megszakítások</h3>
<p class="bekezd">
  A hardveres megszakítások természetes absztrakciója egy IPC-üzenet. A 
  hardver szálak egy halmazának tekinthető, amelyeknek speciális szálazonosítójuk 
  van, és üres üzeneteket küldenek (ami csak a küldő azonosítóját tartalmazza) a 
  hozzájuk rendelt szoftveres szálaknak. A fogadó szál a küldő azonosítójából 
  következteti ki, hogy az egy hardveres megszakítás és éppen melyik (íme egy pszeudókód):
</p>
<p class="programkod">
  driver thread:<br />
  do<br />
  wait for (msg,sender);<br />
  if sender = my hardware interrupt<br />
  then read/write io ports;<br />
  reset hardware interrupt<br />
  else ...<br />
  fi<br />
  od.
</p>
<p class="bekezd">
  A megszakítások üzenetekké való átalakítását a kernelnek kell elvégeznie, de a mikrokernel nem foglalkozik az
  eszközökhöz kapcsolódó megszakítás-kezeléssel. Egyáltalán semmit sem tud a megszakítások szemantikájáról.
</p>
<p class="bekezd">
  Némely processzoron a megszakítás nyugtázása az egy eszközhöz kapcsolódó tevékenység, amelyet a felhasználói 
  szinten lévő eszközmeghajtók kezelik le. Az &quot;iret&quot; utasítást csak arra használják, hogy kivegyék a 
  rendszerveremből az állapotinformációt, vagy éppen visszaváltsanak felhasználói módba, amit a kernel el is rejthet.
  De ha a processzornak privilegizált utasításra van szüksége egy megszakítás &quot;elengedéséhez&quot;, azt a kernel
  implicit módon elvégzi, amikor az eszközmeghajtó kiadja a következő IPC-műveletet.
</p>
<h3>Az egyedi azonosítók szerepe</h3>
<p class="bekezd">
  Egy mikrokernelnek egyedi azonosítókat kell biztosítania (unique identifier - uid) mindennek, legyen az akár szál,
  taszk vagy kommunikációs csatorna. Ezek az uid-ek szükségesek a megbízható és a hatékony helyi kommunikációhoz.
</p>
<p class="bekezd">
  Ha S1 üzenetet akar küldeni S2-nek, akkor meg kell adni az S2-t mint 
  célt (vagy valamilyen kommunikációs csatornát, ami az S2-höz vezet). Ezért 
  tudnia kell a mikrokernelnek, hogy melyik uid tartozik az S2-höz. Másrészről, ha 
  S2 meg akar bizonyosodni arról, hogy az üzenet tényleg az S1-től jött. Emiatt 
  minden azonosítónak egyedinek kell lenni mind (processzor)időben és (cím)térben.
</p>
<p class="bekezd">
  Elméletileg akár titkosítást is lehetne használni. A gyakorlatban 
  viszont túlságosan &quot;drága&quot; (sok időbe telik), hogy a helyi üzeneteket 
  titkosítani kelljen, és a kernelben is illik megbízni (tehát alkalmazása nem 
  indokolt)! S2-nek amúgy nem kötelező rábíznia magát a felhasználó által 
  felajánlott lehetőségekre, mivel az S1 vagy valamelyik más példány meg is 
  többszörözheti és átadhatja azokat S2 irányítása nélkül más alrendszereknek, amiben az S2 éppen nem is bízik.
</p>
<h3>Az interfész-definíciós nyelv, az IDL4</h3>
<p class="bekezd">
  Ahogy az IPC-műveletek egyre gyorsabbak lesznek, úgy az ún. &quot;sztubkód&quot; 
  hatékonysága is egyre fontosabb lesz a helyi kliens-szerver alapú RPC (Remote 
  Procedure Call)-k és a komponenseken belüli kapcsolatok tekintetében. Ez a 
  sztubkód egy olyan programrészlet, amely garantálja, hogy a folyamatok 
  &quot;beszélgetése&quot; a mikrokernel szabályai szerint folyik. Egyben megkönnyítik egy 
  szerver- kliensíró munkáját, hiszen nem kell ismernie azt, hogy az üzenetek 
  milyen elemekből állnak. Nem is beszélve arról, hogy ezzel létrehozunk egy újabb 
  absztrakciós szintet, tehát teljesen el lehet fedni vele az üzenetkezelés 
  implementációját, egy hordozható eszköztárat alakítunk ki. De mivel ezek a 
  rendszer igen fontos építőelemei (minden programba beépülnek, és ugyebár a 
  teljesítmény szempontjából fontos IPC/RPC-ket kezelik), rosszul megírva akár meg 
  is duplázhatják egy üzenetváltás költségeit. Igazából a sztubnak is lehetne magyar megfelelője, talán a 
  &quot;tok&quot; lenne rá a legjobb szó; bár a &quot;tokkód&quot; elég furcsán hangzik :))
</p>
<p class="bekezd">
  Az L4 fejlesztése során így kifejlesztettek egy teljesen új IDL-fordítót, amely közel optimális kódot generál az L4
  mikrokernel és a gcc (GNU Compiler Collection) használatakor. A jelenleg még csak kísérleti fázisban lévő
  IDL4-fordító tehát szorosan együttműködik gcc-vel és annak x86 architektúrára készített kódgenerátorával.
</p>
<p class="bekezd">
  Természetesen más architektúrák és más fordítók más optimizációkat 
  kívánnak meg. Viszont azt lehet elérni, hogy a esetek igen nagy százalékában ez 
  a fordító megközelítőleg háromszor gyorsabb (és kisebb) kódot generál, mint egy 
  elterjedtebb hordozható IDL-fordító. A mérések szerint ez az előny nem is 
  annyira elhanyagolható: egy kellően jó sztubkód tíz százaléknál is nagyobb 
  teljesítménynövedekést indukál. Ezeket eredményeit az IBM SawMill-jében is 
  felhasználták, aminek feladata egy többszerveres operációs rendszer technológiájának kifejlesztése.
</p>
<p class="bekezd">
  A többszerveres és a komponens-alapú rendszerek ígéretes szervezési 
  módnak tűnnek napjaink operációs és alkalmazói rendszereinek szempontjából. A 
  komponensek vagy szerverek (és kliensek) egymással a tartományaikon keresztül 
  kommunikálnak a módszereik meghívásaival. Ha egy hívás átlépi a biztonsági 
  küszöböket (a címtereket), akkor ezeket jellemző módon IPC-ken keresztül 
  valósítják meg: először is, az ilyen kölcsönhatásoknak nagyon gyorsan és 
  pontosan kell lezajlaniuk. Ezért közel egy évtizedig a teljesítményekre 
  vonatkozó kutatások és fejlesztések egy viszonylag elfogadható IPC-s költséget 
  adtak eredményül. Másodsorban, a komponensek kölcsönhatásainak egy 
  alkalmazásprogramozó szempontjából is könnyen kezelhetőnek kell lennie. Ez az 
  elvárás alkotta meg interfész-definíciós nyelv (Interface Definition 
  Language)-eket; ilyenek a CORBA IDL, a DCOM és a hozzájuk tartozó fordítók. Az 
  interfész eljárás/módszer-definícióiból az ilyen fordítók sztubkódot hoznak 
  létre: &quot;becsomagolják&quot; a kliens oldalon a paramétereket, levezénylik az 
  üzenetváltásokat a kernel által biztosított IPC- és RPC-mechanizmusokon keresztül, &quot;kibontják&quot; a kapott 
  paramétereket a szerver oldalon, meghívják a kért szerverbéli eljárást/módszert, stb.
</p>
<p class="bekezd">
  Végeredményben egy programozó ugyanúgy képes megadni és használni 
  távoli interfészeket, mint belsőket. Mindeddig az IDL-fordítókhoz kapcsolódó 
  kutatások leginkább arra koncentráltak, hogy használható és hordozható 
  sztubkódot hozzanak létre, ahelyett, hogy azok teljesítményét figyelembe vették 
  volna. Tény, ami tény, a mikrokernelek hajnalán több száz ciklusra is felduzzadt így egy üzenetváltás.
</p>
<p class="bekezd">
  Napjainkban egyre nagyobb a jelentőségük ezeknek a kódoknak is. 
  Természetesen az eddig kísérletezések sem vesztek kárba, hiszen kiváló alapot 
  szolgáltattak az optimizált interfészekhez; ezért ne feltétlenül baklövésnek, inkább egy lépcsőnek vegyük őket!
</p>
<h3>L4/x86 IPC</h3>
<p class="bekezd">
  Az interfészek megértéséhez elsőként szükségünk van maguknak az üzenetek felépítésének (felületes) megismerésére.
  Az L4 alapvető kommunikációs paradigmája a szinkron-IPC. Ennek alapműveletei a küldés (send), fogadás (receive)
  és a hívás (egy összekapcsolt, &quot;atomi&quot; küldés és fogadás), és az atomi &quot;válaszadás 
  és várakozás&quot; (reply &amp; wait). Maguknak az üzeneteknek pedig számos fajtája különíthető el:
</p>
<ul>
  <li>regiszterüzenetek (register messages): csupán pár 32 bites szóból áll, 
  amelyeket az általános célú regiszterekben lehet elküldeni, illetve fogadni. 
  Az x86 platformon ezek száma maximálisan három lehet (ehhez jön még hozzá a 
  küldő azonosítója és az üzenet leírója (message descriptor)), ezek alkotnak 
  egy regiszterüzenetet. Alkalmazásuk során semmilyen másolási műveletre nincs 
  szükség a címterek között, így ezek költsége a legalacsonyabb; (Ez nagyjából 
  180 órajelciklus egy 450 MHz-es Pentium III-ason.)</li>
  <li>memóriaüzenetek (memory messages): segítségükkel a küldő a fogadó 
  címterére képes hosszabb üzeneteket is átmásolni. Egy ilyen üzenet mérete 
  legfeljebb 2 MB lehet. Ez a mechanizmus jóval lassabb a regiszteres 
  megoldásnál, mert memóriába és memóriából való másolást takar, és a kernelnek 
  esetlegesen meg is kell osztania lapokat a küldő és a fogadó címtere között;</li>
  <li>indirekt sztringek (indirect strings): megkerülik azt, hogy feleslegesen 
  másolni kelljen az üzenetpufferba. Maximálisan 31 sztringet tartalmazhat 
  egyetlen ilyen memóriaüzenet. A fogadó oldalán ilyen pufferek megadhatóak, így 
  az IPC mentén közvetlenül a szerver objektumtól a kliens objektumhoz lehet 
  másolni a sztringet, és vica versa. Az &quot;összegyűjtés/szétszedés&quot; (scatter/gather) 
  folyamata lehetővé teszi a sztringek számára, hogy azok összegyűljenek a küldő 
  oldalán és/vagy szétszedhetőek legyenek a fogadó oldalán. Ilymódon több blokk 
  közvetlenül átküldhetővé válik egyetlen fogadópufferben; egy egyszerű 
  küldőpuffer több részre oszhatóvá válik;</li>
  <li>lapüzenetek (map messages): kisebb vagy nagyobb területeket belapoz a 
  küldő címteréből a fogadó címterületébe. Ezzel valósíthatóak meg a 
  felhasználói szintű lapozók és a központi memória kezelése a mikrokernel 
  &quot;tetején&quot;. De más, az osztott területen (shared memory) alapuló kommunikációs 
  mechanizmusok is (pl. csövek a UNIX-ban) ráépíthetők erre az üzenettípusra;</li>
</ul>
<h3>Más IDL-fordítók, interfész-generálók</h3>
<p class="bekezd">
  A Mach interfész-generátora, a MIG (Mach Interface Generator) a 
  Matchmaker nyelvet használja fel. Ez a nyelv a &quot;többnyelvű&quot; folyamatok közötti 
  kapcsolati interfészek leírására és a generálás automatizálására használatos. A 
  MIG ennek egy &quot;gyengített&quot; implementációja, amely C és C++ nyelvű távoli 
  eljáráshíváson (remote procedure call) alapuló interfészeket és IPC-ket generál 
  a Mach rendszer taszkjai között. Az RPC-k természetesen itt is egy kliens és egy szerver között történnek.
</p>
<p class="bekezd">
  A Mach IPC-interfésze programozási nyelvtől független és meglehetősen 
  összetett. A MIG-et is tehát arra tervezték, hogy C nyelven automatikusan 
  legenerálja a küldéshez szükséges adatok összegyűjtését és a fogadáshoz 
  szükséges adatok szétszedését, amik a folyamatok közti kommunikációk során 
  keletkeznek. A felhasználónak ehhez mindenképpen meg kell adnia egy olyan 
  állományt, amely mind tartalmazza az üzenetküldés és a távoli eljáráshívás 
  interfészét. Ebből a MIG három további file-t állít elő:
</p>
<ul>
  <li>felhasználói interfészmodul (User Interface Module): ez szerkesztődik 
  hozzá a kliensprogramhoz. Implementálja és elérhetővé teszi azokat az 
  eljárásokat és függvényeket, amelyek elküldenek egy adott üzenetet a 
  szervernek, vagy fogadnak tőle;</li>
  <li>felhasználói fejlécmodul (User Header Module): ez a modul azokat típusokat 
  és prototípusokat tartalmazza, amelyek a kliens kódjában szerepelni fognak és 
  szükség van rájuk a fordítási időben;</li>
  <li>szerver interfészmodul (Server Interface Module): a modul a szerver 
  folyamathoz szerkesztődik hozzá. Kibontja a bemeneti paramétereket egy 
  IPC-üzenetből és meghívja a szükséges eljárást a szerveren belül, hogy 
  elvégezze a kívánt műveletet. Amikor ez befejeződik, tehát a szerver eljárása 
  vagy függvénye visszaadja a vezérlést, a generált interfészmodul összegyűjti a 
  kimeneti paramétereket és megformázza őket egy válaszüzenetben;</li>
</ul>
<p class="bekezd">
  Az olyan IDL-fordítók, mint a Flick (Flux Research Group - Utah) 
  viszonlyag könnyűvé teszik egy teljesen új operációs rendszer vagy félig kész 
  kernel &quot;mikrokernel felé hozását&quot;, és akár új adattípusokkal is bővíthetőek. Egy 
  IDL-fordító kimenete többnyire egy általános célú fordítóprogram (mint amilyen a 
  gcc is, amit egy programozó a kód fejlesztésére használ) bemenete.
</p>
<p class="bekezd">
  Természetesen újabb terület ezen fordítók könnyű hordozhatósága a különböző általános célú fordítóprogramok között.
</p>
<p class="bekezd">
  A Flick hatékony sztubkódot ún. inline függvények (amikor nem egy 
  függvényhívást helyezünk el egy kódban, hanem a forrásszövegben előforduló 
  hívások helyére magának a függvények a kódját helyezzük el) és makrók 
  alkalmazásával próbál generálni, amikor azok csak lehetségesek. Mindazonáltal, 
  amikor ezt pl. a gcc-vel kombináljuk, eredményül óriási mennyiségű adatműveletet 
  kapunk, melyek valójában feleslegesek. Elméletileg ezeket a fordítónak el 
  kellene távolítania. Gyakorlatilag viszont az ehhez szükséges adatelemzések 
  túlságosan is körülményesek; ebből következik, hogy a generált programkód mégsem hatékony.
</p>
<h3>Az L4 sztub-modellje</h3>
<p class="bekezd">
  Beszéljünk egy egyszerűsített modellről! Ezen keresztül kerül 
  bemutatásra mind a szerven és a kliens oldalán megjelenő sztubkód. Ebben az 
  egyszerű modellben feltételezzük, hogy egy kliens meghívja a szerver által 
  nyújtott M eljárást, vagy módszert. A szinkronizációtól és az egyidejűségtől 
  most eltekintünk. Az M-nek vannak bemenő paraméterei (in) (azok az értékek, 
  amelyek a kliens ad át a szervernek) és kimenő paraméterei (out) (azon értékek, 
  amit a szerver visszaküld a kliensnek), és eredmény paraméterei (inout), 
  amelyeket először megkap a szerver, majd azokat felülírja és visszaküldi. Az 
  IDL-fordító generál egy M_kliens klienssztub-eljárást minden M függvényhez, ami 
  szerepel az interfész definíciójában. Ez a klienssztub hívódik meg a kliens 
  által. Ez elrejti, hogy a szolgáltatás nem a kliens címterében (&quot;helyben&quot;) fut le, 
  hanem egy másikban vagy éppen egy tőle kilométerekre levő másik számítógépen!
</p>
<p class="bekezd">
  A klienssztub tehát összeállítja az üzenetet, és minden olyan 
  információt belerak, amire a szervernek szüksége van a feladat teljesítéséhez, 
  beleértve minden paramétert. (A neve &quot;feltűzés&quot; (marshalling).) Az üzenet 
  ezután el lesz küldve a szervernek és a kliens pedig vár annak válaszára. A 
  válaszként kapott üzenet tartalmazza az összes kimenő és eredmény paraméter 
  értéket. A klienssztub kibontja ezeket az értékeket az üzenetből, és &quot;szétszedi&quot; 
  (unmarshalling) az adott kliens paraméterekbe.
</p>
<p class="programkod">Részletesebben, az M_kliens lépései:</p>
<p class="programkod">
  K1: létrehoz egy kérést (request message), mely tartalmaz minden bemenő és 
  eredmény paramétert, és egy kulcsot (key), ami azonosítja az M eljárást/módszert (&quot;feltűzés&quot;);
</p>
<p class="programkod">K2: elküldi a kérést annak a szervernek, amely implementálja M-et, és 
  megvárja annak válaszát;</p>
<p class="programkod">K3: kitölti az eredmény és kimenő paramétereket a válaszban megkapott 
  adatokkal (&quot;szétszedés&quot;), majd</p>
<p class="programkod">K4: visszatér velük a hívó klienshez.</p>
<p class="bekezd">
  A szerver programozója implementál egy M_szerver eljárást szerver 
  oldalon minden egyes M-hez, ami szerepel az interfész definíciójában. Az 
  IDL-fordító létrehoz egy központi (kód)sablont, ami kezeli a kommunikációt, 
  dekódolja, összerendezi és visszarendezi a paramétereket. Ez a központi 
  szerverkód általában tartalmaz egy főciklust, ami fogadja a kliensek felöl 
  érkező kéréseket és továbbítja azokat a megfelelő M_szerver eljáráshoz. Minden 
  egyes M_szerver-hez az IDL-fordító generál egy szerversztubot, amit megvizsgálja 
  a kérést és fogadja az adatokat (&quot;szétszedés&quot;). Ezután a sztub meghívja magát a 
  rutint és végül elkészíti a választ a kliens számára. Egy IDL-fordítónak mind a 
  főciklust, mind a sztubokat automatikusan kellene generálnia. A felhasználók 
  számára pedig lehetőséget kellene adnia, hogy azok könnyen módosíthassák a ciklus kódját, ha esetleg további 
  tulajdonságokat szeretnének implementálni, pl. terhelés-kiegyenlítés (load balancing).
</p>
<p class="programkod">Lényegében egy szál várja a kliensek kéréseit:</p>
<p class="programkod">Sz0: fogadja a kérést és a kapott kulcsból megállapítja, hogy melyik M 
  eljárást/módszert kellene meghívni és milyen paramétereket kell majd az M-nek visszaadnia;</p>
<p class="programkod">Sz1: kibontja a bemenő és eredmény paramétereket a kapott üzenetből (&quot;szétszedés&quot;);</p>
<p class="programkod">Sz2: meghívja az M_szerver szerverbéli eljárást a kibontott paraméterek értékeivel;</p>
<p class="programkod">Sz3: létrehoz egy válaszüzenetet (reply message) és eltárolja a kapott 
értékeket, az M_szerver eljárás eredmény és kimenő paramétereit ebben az üzenetben (&quot;feltűzés&quot;);</p>
<p class="programkod">Sz4: visszaküldi a választ a kliensnek.</p>
<p class="bekezd">
  A K2, Sz0 és az Sz4 lépéseket alapjában véve a &quot;futtató IPC-rendszer&quot; határozza meg, ami jelen esetünkben
  az L4 mikrokernel. A K4 és Sz2 lépéseket a használt általános célú fordító adja meg, ami most a gcc. A 
  &quot;feltűzés&quot; és &quot;szétszedés&quot;, tehát a K1+Sz1, illetve az Sz3+K3 kevésbé behatároltak (az IDL-fordító
  szempontjából) és sokkal fontosabbak. Ahogy a Flick-kel kapcsolatban is megemlítettük, egy kevésbé optimális kód
  könnyen jelentős mennyiségű felesleges másolási műveletet eredményez a &quot;feltűzés&quot; és a &quot;szétszedés&quot; során.
</p>
<h3>&quot;Feltűzés&quot; közvetlen verem-átvitellel</h3>
<p class="bekezd">
  Hogy lássuk, miként képesek a paraméterek a leghatékonyabban áramlani az M_kliens és M_szerver között, meg kell
  figyelnünk egy &quot;helyi&quot; eljáráshívást. A gcc és sok más C fordító a bemenő paramétereket a verem tetejére
  helyezi az eljárás meghívása előtt. Most nézzük ezt &quot;távoli&quot; esetben: csupán három paraméter-érték kerül 
  a kliens vermére (M_kliens), és a szerver oldalán futó M_szerver-nek normális esetben egy teljesen ugyanolyan
  veremmel kellene rendelkeznie, mert az M_szerver-nek ugyanazok a paraméterei, mint az M_kliensnek.
</p>
<p class="bekezd">
  Tehát ekkor a sztubkódnak csak a kliens vermének egy részét kell átmásolnia a szerver vermére. Semmilyen egyéb 
  művelet, sem &quot;feltűzés&quot;/&quot;szétszedés&quot; nem szükséges.
</p>
<p class="bekezd">
  Mivel C-ben a kimenő paraméterek többnyire mutató típusú változókkal 
  vannak implementálva (melyek bemenő paraméterként is szerepelnek), ki kell 
  egészítenünk a paraméterek halmazát további ilyen változókkal, amelyek azon 
  társaikat címzik, akiket később vissza fogunk küldeni a kliensnek, mint kimenő 
  paramétereket. Az L4-ben konkrétan így oldják meg:
</p>
<p class="bekezd">
  <b>1.</b> A kliens felépít egy olyan üzenetet, ami tartalmazza mind a bemenő és az 
  eredmény értékeket (meg még esetleg egyéb sztringeket). Az üzenetpufferben van 
  elég hely, hogy tudja fogadni benne a szervertől érkező választ;
</p>
<p class="bekezd">
  <b>2.</b> A szerver kiegészíti a kapott üzenetet még mutatókkal, amelyek 
  megcímezhetővé teszik az eredmény és kimenő paramétereket (és az opcionálisan 
  szereplő sztringeket is) a M_szerver szerver oldali eljárás számára. Ezután 
  hívódik meg az M_szerver. Mint bármelyik más C függvény, a saját bemeneti paramétereivel dolgozik;
</p>
<p class="bekezd">
  <b>3.</b> Miután befejeződött az M_szerver, a sztub eltávolítja a mutatókat és a 
  bemenő paramétereket a veremről, a tetejére teszi a visszatérési értéket és 
  megfelelő üzenőfejlécet, majd elküldi az így keletkező választ a kliensnek.
</p>
<p class="bekezd">
  Közvetlen következménye a verem és az üzenet felosztásának, hogy az 
  IDL-fordítónak át kell rendezni a paramétereket.
</p>
<h3>Összetett adattípusok</h3>
<p class="bekezd">
  Jelen pillanatban az IDL4 csak 32 bites szavakat és legfeljebb 2 MB-os 
  sztringeket képes kezelni. Ezek később még ki fognak egészülni a lapokkal is, 
  így az IDL függvényein keresztül tud majd kezelni lapozást is. Ezek ellenére 
  bármilyen más adattípus implementálható a alaptípusokkal. A nagyobb objektumok, 
  mint tömbök vagy rekordok egyszerűen tekinthetők sztringeknek, míg a kisebbek 
  (karakterek, rövidebb egészek) nyugodtan kiterjeszthetőek 32 bites szavakká. A 
  kisebb objektumok szavakká való kiterjesztése amúgy sem okoz többletköltséget, 
  hiszen a gcc is szavakként kezeli ezeket, amennyire csak lehetséges egy normál 
  függvény generálásakor. Hasznos a nagyobb adattípusok indirekt sztringekként 
  történő megvalósítása is, mert nem másolódnak közvetlenül az üzenőpufferba.
</p>
<h3>A kódgenerálás</h3>
<p class="bekezd">
  A fenti elméleti leírás illusztrálására elemezzük ki, hogy a fordító 
  mit fog tenni a pfs_write() függvény esetében! (A pfs_write() a fizikai 
  állományrendszer írási műveletét realizálja). A függvény prototípusa a következő 
  (kiegészítve a paraméterek szerepével)):
</p>
<p class="programkod">
  int pfs_write(<br />
  int handle /*be*/,<br />
  int* pos /*eredmény*/,<br />
  int len /*be*/,<br />
  int data_size /*be*/,<br />
  int* data /*be,<br />
  data_size hosszan*/ );
</p>
<p class="bekezd">
  Az IDL4 három állományt hoz létre, amelyek magukban foglalják a 
  klienssztubot, a szerversztubot és a fő szerverciklust. A sztubok a gcc-ben 
  függvényként szerepelnek, de assembly-ben vannak megírva. A szerverben futó 
  főciklus C-ben keletkezik, így könnyen átalakítható egy alkalmazásíró számára. 
  Minden függvényben közös, hogy dekódolják a beérkező kéréseket, tehát 
  kiválasztják megfelelő szolgáltatást és meghívják azt a sztubon keresztül:
</p>
<p class="programkod">
  setupNewBuffer(); /* az új puffer előkészítése */<br />
  ipcReceive(); /* az IPC-üzenet fogadása */<br />
  do { /* a ciklus eleje */<br />
  unpackQuery(); /* a kérés &quot;szétszedése&quot; */<br />
  callStub(); /* a sztub meghívása */<br />
  packResponse(); /* a válasz &quot;feltűzése&quot; */<br />
  setupNewBuffer(); /* egy új puffer előkészítése */<br />
  ipcReplyWait(); /* a válasz küldése és várakozás a következő kérésre */<br />
  } while(1); /* egy végtelen ciklus */
</p>
<h3>Kliens sztub</h3>
<p class="bekezd">A kliens oldalon keletkezett kód a következőképpen fog működni:</p>
<p class="bekezd"><b>1.</b> Az indirekt sztringek leíróinak elkészítése: a pfs_write() egyetlen bemenő 
  sztringgel rendelkezik, ez a &quot;data&quot;, tehát ehhez létre kell hozni egy leírót (descriptor);
</p>
<p class="bekezd"><b>2.</b> A paraméterek &quot;feltűzése&quot;: a bemenő és eredmény paraméterek a veremre 
  pakolódnak, a sorrend fordított. Viszont két paraméter (a &quot;len&quot; és a &quot;handle&quot;) 
  nem oda kerül, hanem az EBX és az EDI regiszterekbe;
</p>
<p class="bekezd"><b>3.</b>
  Az üzenőfejléc létrehozása: a fejléc megadja, hogy mennyi szót (dword ~double 
  word - x86 architektúrán ez ekvivalens a 32 bites szavakkal) kell mindkét 
  irányba továbbítani, illetve ehhez csapódik még egy lapozásra használatos, de 
  jelen pillanatban nem alkalmazott szó is;
</p>
<p class="bekezd">
  <b>4.</b> A regiszterek beállítása az IPC-re és a függvénykulcs megadása: az 
  IDL4-nek meg kell adnia a külső és fogadó pufferek címét és egy határidőt (timeout). 
  Ugyanitt kerül átadásra a regisztereken keresztül a függvény azonosítója;
</p>
<p class="bekezd"><b>5.</b> Az IPC meghívása;</p>
<p class="bekezd">
  <b>6.</b> A szerver kimenetének &quot;szétszedése&quot;: a pfs_write() esetében a visszatérési 
  értékét és a &quot;pos&quot; paramétert kell lekezelni. Ezek szintén átadhatók kizárólag 
  csak regiszterek segítségével, így egyáltalán nem használtunk semmilyen memóriapuffert.
</p>
<h3>Szerver sztub</h3>
<p class="bekezd">
  Ez a sztub a szerver ciklusából hívódik meg. Átalakítja a klienstől 
  érkező kérést egy verembeli keretté (frame) a szerver számára:
</p>
<p class="bekezd"><b>1.</b> Beállítja a veremmutatót az üzenőpufferra: az üzenet fejléce és a függvény 
  azonosítója (amely az első szó a sorban) felülírható, így az új ESP a puffer ötödik szavára mutat;
</p>
<p class="bekezd">
  <b>2.</b> Hozzáadja a mutatókat a sztringekhez és a kimenő értékekhez: először is, 
  hogy &quot;pos&quot;-t címző mutató kerül a veremre, majd egy a bemenő sztringpufferba. 
  Végül a megadjuk annak a szálnak az azonosítóját, ahonnan az üzenet származik;
</p>
<p class="bekezd"><b>3.</b> Elvégzi a függvény meghívását;</p>
<p class="bekezd">
  <b>4.</b> Felépíti a választ: a bemenő értékeket és mutatókat eldobja, majd a 
  visszatérési értéket és az új üzenet fejlécét teszi hozzá;
</p>
<p class="bekezd">
  <b>5.</b> Visszaállítja a veremmutatót: a függvényhívás közben az eredeti érték el 
  volt mentve az EBP-ben, az egyetlen olyan regiszterben, amit a gcc automatikusan elment.
</p>
<h3>A hordozhatóságról</h3>
<p class="bekezd">
  Az IDL4 bebizonyította, hogy a sztubkódok optimizálása jelentősen mégtérül, és talán nagyban hozzájárul ahhoz, hogy
  az ilyen komponens-alapú rendszerek megüssék a piac által megkövetelt szintet. Bár ezzel kapcsolatban felmerül néhány kérdés:
</p>
<p class="bekezd">- Mennyire tehető hordozhatóvá egy optimizáló IDL-fordító?</p>
<p class="bekezd">- Mit kell tenni ahhoz, hogy a fordítót egy újabb általános célú fordítóprogramra, vagy számítógépes architektúrára át tudjuk ültetni?</p>
<p class="bekezd">
  Jelenleg az IDL4 kódgenerátor a gcc fordítóprogramra és az x86-os processzorok van &quot;belőve&quot;. A 
  fejlesztőknek azért van néhány sejtésük arról, hogy mivel járna más architektúrákra felépíteni ugyanezt a rendszert:
</p>
<ul>
  <li>Eltérő regiszterkiosztás: könnyen adaptálható, legalábbis azokhoz képest, 
  amelyek feltétlenül igénylik a C kötések módosítását mind a 7 rendszerhívás esetén;</li>
  <li>Eltérő processzor: szintén kis költséggel jár az átállás, amennyiben a 
  verem felépítése hasonló. Lényegében azok a sztubsémák, amiket az IDL4 használ 
  fel a kód generálásakor, csak át kell írni az adott processzor gépi vagy assembly kódjára;</li>
  <li>Eltérő verem-felépítés: attól függően, hogy mennyire tér el a verem 
  felépítése, az átírás költségei alacsonyak vagy magasak lehetnek. Ha csak a 
  sorrend vagy a &quot;távolságok&quot; térnek el, akkor az nem okozhat gondot; viszont 
  egy verem nélküli futtató rendszer esetében egy teljesen új adatmodellt kell 
  kidolgozni a címterek közti paraméterek mozgatásához;</li>
  <li>Eltérő C fordító: minden problémától mentes, ha az adott C fordító 
  lehetővé tesz inline assembly eljárásokat, mint ahogy azt a gcc teszi. Közepes 
  vagy magas költség abban az esetben, amikor támogatja, de eltérő a 
  szintaktika. Viszont ha nem rendelkezik egyáltalán ilyen lehetőséggel, akkor 
  az átírás lehetetlen, vagy nem lenne elég hatékony.</li>
</ul>
<p class="bekezd">
  Az utolsó pont egy legkritikusabb. Nagyon nehéz, vagy egyenesen 
  lehetetlen megoldani az optimalizációkat, ha a C fordító nem ad hozzáférési 
  lehetőséget a saját kódgenerálási folyamatához. De a probléma még akkor is 
  fennállni látszik, mikor az IDL-t leválasztjuk a programozási nyelvről. Az 
  összes többi esetben az adaptáció költsége hasonló, ha nem alacsonyabb, mint egy 
  átlagos fordítóra való portolás.
</p>
<h3>Összegzés</h3>
<p class="bekezd">
  Az ilyen mikrokerneles rendszerek egyik nagy próbája a már létező UNIX 
  változatok implementálása. Ezt többnyire egyetlen szerverrel valósítják meg, ami 
  tehát az adott monolitikus kernel átírása egy folyamatba. Viszont az igazi 
  rugalmasságot és erőt az rejti magában, amikor egy mikrokernel felett több 
  szerver fut párhuzamosan, és mindegyik más-más funkciót lát el a rendszerben. 
  Remélem, még nincs késő, és például a neuronhálón alapuló operációs rendszerek 
  nem söprik le az asztalról több évtized kemény fejlesztői munkáját. Nem azért 
  tartanám igazságtalanságnak, mert felszámolnák a szívemhez közel álló 
  &quot;klasszikus&quot; rendszereket, hanem mert ez akkor egy olyan rendszer lenne, amely 
  soha nem tudott beteljesedni, elfoglalni az őt megillető (megérdemelt) helyét.
</p>
<h2>Felhasznált irodalom</h2>
<p class="bekezd">Jochen Liedtke: On m-Kernel Construction (15th ACM Symposium on Operating Systems Principles, 1996);</p>
<p class="bekezd">Toward Real Microkernels (September 1996/Vol 39., No. 9 - Communications of the ACM);</p>
<p class="bekezd">Trent Jaeger, Kevin Elphinstone, Jochen Liedtke, Vsevolod Panteleenko, Yoonho Park: Flexible Access
  Control Using IPC Redirection (IBM T.J. Watson Research Center);</p>
<p class="bekezd">Kevin Elphinstone, Volkmar Uhlig, Uwe Dannowski, Espen Skoglund: m-Kernel 
  Construction (az előadássorozat vázlata);</p>
<p class="bekezd">Andreas Haeberlen, Jochen Liedtke, Yoonho Park, Lars Reuther, Volkmar Uhlig: 
  Stub-Code Performance is Becoming Important (University of Karlsruhe - System 
  Architecture Group, IBM T.J. Watson, Dresden University of Technology - Department of Computer Science);</p>
<p class="bekezd">Keith Loepere: Mach 3 Kernel Principles (Open Software Foundation and Carnegie-Mellon University, 1992);</p>
<p class="bekezd">Richard P. Draves, Michael B. Jones, Mary R. Thompson: MIG - The MACH 
  Interface Generator (Carnegie-Mellon University - Department of Computer Science, 1989)</p>
<p class="bekezd">The Flux Research Group: The OSKit: The Flux Operating System Toolkit Version 
  0.97 (University of Utah - Department of Computer Science, 2002)</p>
<p class="bekezd">
  Ezzel a dokumentummal kapcsolatban minden megjegyzést, kérdést, kérést a <a href="mailto:pg0003@delfin.klte.hu">pg0003@delfin.klte.hu</a> 
  címre lehet küldeni. A tévedés, félre{fordítás|értelmezés}és a frissítés jogát fenntartom! A leírás nyomtatott 
  formában való megjelenése és terjesztése megengedett bármilyen formában, de erről kötelező értesíteni a szerzőt!
</p>
</body></html>