#Klooienmetcomputers

Van INT 21h naar syscalls

Arnout van Kempen over rommelen in een digitale wereld.

We hebben gezien hoe het gebruik van BIOS ervoor zorgde dat CP/M op veel verschillende computers kon werken, mits ze maar een 8080 of Z80 CPU hadden. Datzelfde idee gebruikte IBM om de eerste pc's hardware-onafhankelijk te maken en daarmee zowel een commercieel succes te bouwen, als hun eigen concurrentie in het leven te roepen. CP/M en later MS-DOS gebruikten BIOS calls voor lagere hardwarefuncties en calls naar het besturingssysteem om hogere hardwarefuncties beschikbaar te maken voor de gebruiker. In MS-DOS liep dat via de INT 21h. Voor hobbyisten een prachtig systeem, helemaal omdat je via TSR’s en overnemen van interruptvectors het systeem geheel naar je hand kon zetten. In moderne systemen werkt dat niet veilig genoeg, gebruikers gaan elkaar in de weg zitten, processen kunnen elkaar verstoren. Het gebruik van een MMU en van een vorm van protected mode kan dat oplossen, mits het operating system netjes gebruik maakt van die mogelijkheden.

Het is van belang te bedenken dat operating systems hiermee grotendeels zelfs CPU-onafhankelijk worden. Linux op een PC met 80x86 werkt op logisch niveau exact hetzelfde als Linux op een mobiele telefoon met ARM processor. Wel zijn er duidelijke verschillen tussen POSIX-systemen enerzijds en Windows anderzijds. Beide systemen maken gebruik van een syscall, maar Windows schermt dat maximaal af om zo een omgeving te geven die makkelijk en veilig is maar weinig flexibiliteit gunt aan de programmeur, terwijl POSIX-systemen simpeler zijn van opzet, meer flexibiliteit en toegankelijkheid geven en daarmee ook ingewikkelder zijn voor de programmeur die meer zelf onder controle moet houden.

Ter vergelijking twee syscalls. De eerste op Linux:

section .data
    message db "Hello, Linux!", 0xA  ; De boodschap
    msg_len equ $ - message          ; Lengte van de boodschap

section .text
    global _start 

_start:
    ; Parameters instellen
    mov eax, 4         ; Syscall nummer voor 'write'
    mov ebx, 1         ; File descriptor (1 = STDOUT)
    mov ecx, message   ; Adres van de boodschap
    mov edx, msg_len   ; Lengte van de boodschap

    ; Syscall aanroepen
    int 0x80

    ; Programma beëindigen
    mov eax, 1         ; Syscall nummer voor 'exit'
    xor ebx, ebx       ; Exit code (0)
    int 0x80

We hebben het hier over een nieuwere 80x86, met bredere registers, vandaar de e voor de naam. De syscall wordt aangeroepen via interruptvector 80h en veel versiering zit er verder niet bij. Onder Windows ziet zoiets er zo uit:

section .data
    message db "Hello, Windows!", 0xA  ; De boodschap
    msg_len equ $ - message            ; Lengte van de boodschap

section .text
    global _start

_start:
    ; Handle voor STDOUT ophalen
    mov eax, 0x3F ; Syscall nummer voor 'GetStdHandle'
    mov ebx, -11  ; STD_OUTPUT_HANDLE (-11)
    int 0x2E      ; Schakel naar kernelmodus

    mov ebx, eax  ; Sla de STDOUT-handle op in ebx

    ; Bericht schrijven
    mov eax, 0x2D ; Syscall nummer voor 'NtWriteFile'
    mov ecx, ebx  ; Handle voor STDOUT
    mov edx, message ; Adres van de boodschap
    mov esi, msg_len ; Lengte van de boodschap
    int 0x2E      ; Schakel naar kernelmodus

    ; Programma beëindigen
    mov eax, 1    ; Functie om te stoppen
    xor ebx, ebx  ; Exit code (0)
    int 0x2E

Het werkt anders, maar de verschillen zijn niet dramatisch. Linux biedt wat meer rudimentaire faciliteiten dan Windows, maar de basis is heel vergelijkbaar.

Wie mee wil doen met #klooienmetcomputers kan dat doen via GitHub. Maak een account op github.com en zoek naar Abmvk/kmc. Het account Abmvk volgen kan ook. Lezers zijn vrij te gebruiken wat ze willen en om zelf zaken toe te voegen of aan te passen, vragen te stellen of commentaar te leveren.

Arnout van Kempen di CCO CISA is directeur compliance & risk bij aaff, de fusieorganisatie van Alfa en ABAB. Hij schrijft op persoonlijke titel.

Gerelateerd

reacties

Reageer op dit artikel

Spelregels debat

    Aanmelden nieuwsbrief

    Ontvang elke werkdag (maandag t/m vrijdag) de laatste nieuwsberichten, opinies en artikelen in uw mailbox.

    Bent u NBA-lid? Dan kunt u zich ook aanmelden via uw ledenprofiel op MijnNBA.nl.