Edocti
Fortgeschrittene technische Ausbildung für den modernen Softwareingenieur

System calls – part one

Definition: ein kontrollierter Einsprung in den Kernel – eine Möglichkeit, aus einem User-Programm Funktionen mit höheren Privilegien auszuführen.

Kurz zu Privilegien … CPUs/Mikrocontroller besitzen mehrere Betriebsmodi. Einige betreffen Sicherheit. Vereinfacht:

  • welche Speicherbereiche gelesen/geschrieben werden dürfen (Memory-Map; Memory-Mapped I/O)
  • welche Instruktionen ausgeführt werden dürfen (Micro-Instruction-Ebene)

Auf IA-32 gibt es vier Privileg-/Protection-Ringe. Ring 0 (Kernel) hat die höchsten Rechte, Ring 3 ist User-Space. OSes wechseln die Ringe über spezielle CPU-Instruktionen. User-Programme können nicht selbst auf höhere Ringe springen.

Was passiert bei einem Linux system call? Jede OS-API (I/O, Prozesse, IPC …) wird im User-Code typischerweise über einen libc wrapper (z. B. fopen) aufgerufen:

  • wrapper marshallt Parameter in Register (vom User-Stack in z. B. %ecx, %edx); %esp wird gesichert/oft in %ebp gespiegelt
  • wrapper führt sysenter (x86 Fast-Path) aus → Kernel-Entry (z. B. sysenter_entry)
  • auf manchen Setups ruft der wrapper __kernel_vsyscall (Adresse via ELF AT_SYSINFO)

Natürlich kann ein Programm auch direkt die system-call-Instruktion ausführen; wrapper sind portabler/komfortabler.