Podane odpowiedzi są poprawne, ale chciałbym dodać, że istnieje więcej mechanizmów wchodzenia w tryb jądra. Każde najnowsze jądro mapuje stronę "vsyscall" w przestrzeni adresowej każdego procesu. Zawiera niewiele więcej niż najbardziej wydajną metodę pułapek systemowych.
Na przykład na zwykłym systemie 32 bitowym mogło zawierać:
0xffffe000: int $0x80
0xffffe002: ret
Ale na moim 64-bitsystem mam dostęp do drogi bardziej skuteczną metodą przy użyciu instrukcji syscall/sysenter
0xffffe000: push %ecx
0xffffe001: push %edx
0xffffe002: push %ebp
0xffffe003: mov %esp,%ebp
0xffffe005: sysenter
0xffffe007: nop
0xffffe008: nop
0xffffe009: nop
0xffffe00a: nop
0xffffe00b: nop
0xffffe00c: nop
0xffffe00d: nop
0xffffe00e: jmp 0xffffe003
0xffffe010: pop %ebp
0xffffe011: pop %edx
0xffffe012: pop %ecx
0xffffe013: ret
Ta strona vsyscall również mapuje niektóre systemy, które można wykonać bez przełącznika kontekstu. Znam pewną gettimeofday, czas i getcpu są tam odwzorowany, ale mogę sobie wyobrazić getpid zmieściłoby się tam tak dobrze.
+1, interesujące pytanie! –
syscall pytanie implementacyjne: http://stackoverflow.com/questions/499188/how-is-the-system-call-in-linux-implemented – nik
głosowanie do zamknięcia. rzeczywiście jest duplikatem (nie pojawił się w wyszukiwaniu, ponieważ użyłem syscall) –