Systemaufruf
-
Hey leute,
kurze Frage:
Ein Systemaufruf ist soweit ich weiß nichts anderes als ein softwareinterrupt, also sowas in der art "int 0x80".
Nun kann ich aber in C auch über funktionen Systemaufrufe tätigen (zB: fork()).
wie ist eine funktion wie fork() implementiert?wurde das ganze im assembler geschrieben, also in etwa:
fork:
mov $5, %ax; //wenn 5 jetzt beispielsweise für fork() steht
int 0x80;und dann in eine lib gepackt, sodass fork() im C code gerade auf diese stelle verweist?
gruß
-
Grundlegend ist es so richtig, allerdings gibt es da noch ein paar Tricks.
Zum einen besitzen neuere CPUs die Funktionen sysenter/syscall und sysexit mit denen man schneller als mit einem Interrupt in den Kernel und wieder zurück springen kann.
Zum anderen versucht man den Sprung in den Kernel ganz zu vermeiden. Unter Linux nennt sich das vsyscall. Systemaufrufe die im Benutzermodus ausgeführt werden können, aber Daten aus dem Kernel benötigen, kann man so wie einen normalen Funktionsaufruf behandeln. Ein gutes Beispiel dafür ist die Funktion gettimeofday.
P.S. Das ganze gilt natürlich nur für x86. Andere Architekturen besitzen vielleicht nichtmals eine Kernel- und Usermode Trennung. Dann ist ein Systemaufruf einfach nur ein Funktionsaufruf.
-
morgen
so gesehen sind die implementierung der systemfunktionen in C eher primitiver natur oder?
sie verweisen mehr oder weniger einfach auf die ISR und bieten einem eine möglichkeit per C syntax die softwareinterrupts aufzurufen (mit entsprechender belegung der register etc), die systemaufrufen entsprechen oder?gruß
-
guck doch wickypädia: http://en.wikipedia.org/wiki/System_call
-
MatheStein schrieb:
so gesehen sind die implementierung der systemfunktionen in C eher primitiver natur oder?
sie verweisen mehr oder weniger einfach auf die ISR und bieten einem eine möglichkeit per C syntax die softwareinterrupts aufzurufen (mit entsprechender belegung der register etc), die systemaufrufen entsprechen oder?Solange die Systemaufrufe halbwegs mit der C Schnittstelle übereinstimmen ist Aufwand (abgesehen von der Anzahl) sicherlich nicht so groß. Wenn man aber z.B. eine POSIX Schnittstelle für Windows baut, wird man die Parameter und Rückgabewerte sicherlich öfter bearbeiten müssen. An manchen Stellen muss man sich sicherlich auch noch um den Fehlerfall kümmern.
In der uClib kann man die Systemcalls übrigens einigermaßen gut lesen (z.B. http://git.uclibc.org/uClibc/tree/libc/sysdeps/linux/common/rename.c). Die meisten C Libs sind eine riesige Sammlung an Makros, damit sie auf möglichst vielen Architekturen und Betriebsystemen ohne Overhead laufen.