Néhány apróság mélyebben kifejtve a DOS-os cikkhez:
Szegmentált címzés
Az első PC-k 8086-os processzorra 16 bites volt. 16biten csak 64kbájt címezhető, de az Intel mérnökei kis trükkel megoldották a nagyobb memória kezelését. 20 bites címbuszt készítettek, amivel 1MiB kezelhető. A 16 bites regiszterekkel ezt úgy érték el, hogy két 16 bites számot 4 bit eltolással adtak össze. Az eltolt 16 bittel kijelölték, a lapot. A lapok (szegmensek) 16 bájtonként indulnak és 64 kiB méretűek. Az második 16bit megadja a lap kezdetétől számított címet. Számokban:
Hirdetés
1. regiszter: 1 1 1 1
2. regiszter: 2 3 4 5
cím : 1 3 4 5 5
21h megszakítás
A DOS és a BIOS függvényeket szoftveres megszakításokon keresztül lehet meghívni. Ezekkel a szolgáltatásokkal jól szemléltethetőek egy OS alapvető feladatai:
- Input:billentyűzet kezelés
- Output: videó és printer kezelés
- Lemez kezelés: állományok létrehozása, megnyitása, írása, olvasása...
- Programok futtatása
- Memória kezelés: memória allokálás, befoglalt memória felszabadítása...
A szoftveres megszakítás hívásánál meg kelladni, hogy a fent felsorolt funkciók közül melyiket akarjuk elérni. Ezt a processzor AH regiszterében tehetjük meg. Bizonyos esetekben több információt is át kellett adni, ilyenkor más regisztereket (BX, CX, DS, DX) is használni kell. Példaként egy állományból olvasás:
AH - 3F
BX - fájl handle
CX - hány bájtot olvasson be
DS:DX - Memória bázis címe
Visszatérésnél az AX tartalmazza, hogy hány bájtot olvasott be a DOS. Hiba esetén a CF 1-et vesz fel, az AX a hibakódot tartalmazza.
TSR
Terminate and Stay Resident. Az adott program a kilépése után a DOS nem szabadítja fel a memóriát, ha a 31h (AH=31h...) szolgáltatást hívjuk meg. Az adott kód több módon is megkaphatja a vezérlést, csak pár legáltalánosabbat sorolok fel:
- Magára irányítja valamelyik hardveres megszakítást. Például a printerét, így minden alkalommal lefut, ha a hardver interruptot küld. Gép lassítására használt programok az órától érkező INT-re ülnek rá és például jó hosszú ciklusokkal zabálják fel a CPU időt.
- Valamelyik szoftveres megszakításra ül rá. Ilyenkor tipikus, hogy csak pár dolgot kezel, más esetben szimulál egy interruptot és az eredeti kódnak adja át a vezérlést. A vírusok nagyon szerették az INT 21-et átvenni és figyelni az programok futtatását. Ilyenkor automatikusan megfertőzték az állományt.
- Egy üres szoftveres megszakítást vesz át. Az előzőtől csak annyiban tér el, hogy nem adja át a vezérlést. Jó példa rá az egér kezelés, ami a 33h-t használja.
A lényeg az, hogy DOS alatt a TSR-ek csak akkor kapják meg a vezérlést, ha valami (program vagy hardver) meghívja őket egy megszakításon keresztül. Megfelelően megírt programokkal azonban lehet szimulálni cooperatív multitaszk viselkedést, ahogy a Windows is tette a 3.11-es verzióval bezárólag.
Cooperatív multitaszk: A CPU időt nem az OS osztja ki, hanem a programok önként mondanak le a vezérlésről. Ez azt jelenti, hogy egy program rátenyerelhet az összes CPU időre, illetve hiba esetén az egész gépet magával rántja. Windows 3.11 alatt kicsi az esély task managerből kilőni a rendetlenkedő programot.