2024. április 17., szerda

Gyorskeresés

x86 és DOS kicsit mélyebben

Írta: | Kulcsszavak: DOS . LOR . int . int 21h

[ ÚJ BEJEGYZÉS ]

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:

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.

Hozzászólások

(#1) Cucuska2


Cucuska2
őstag

Az a smiley mit rakoncátlankodik ott?

Rock and stone, to the bone! Leave no dwarf behind!

(#2) #19617792 válasza Cucuska2 (#1) üzenetére


#19617792
törölt tag

DS:DX akart lenni, de a portálmotor konvertálta szmájlivá.

(#3) frescho válasza #19617792 (#2) üzenetére


frescho
addikt

Koszi, javitottam.

https://frescho.hu

További hozzászólások megtekintése...
Copyright © 2000-2024 PROHARDVER Informatikai Kft.