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);%espwird gesichert/oft in%ebpgespiegelt - wrapper führt
sysenter(x86 Fast-Path) aus → Kernel-Entry (z. B.sysenter_entry) - auf manchen Setups ruft der wrapper
__kernel_vsyscall(Adresse via ELFAT_SYSINFO)
Natürlich kann ein Programm auch direkt die system-call-Instruktion ausführen; wrapper sind portabler/komfortabler.