Le risposte fornite sono corrette ma vorrei aggiungere che ci sono più meccanismi per accedere alla modalità kernel. Ogni kernel recente mappa la pagina "vsyscall" nello spazio degli indirizzi di ogni processo. Contiene poco più del più efficiente metodo trap di syscall.
Ad esempio, su un normale sistema a 32 bit potrebbe contenere:
0xffffe000: int $0x80
0xffffe002: ret
Ma sul mio 64 bitsystem ho accesso al modo metodo più efficiente utilizzando le istruzioni 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
Questa pagina di vsyscall mappa anche alcune chiamate di sistema che possono essere eseguite senza un interruttore di contesto. So certo gettimeofday, tempo e getcpu sono mappati lì, ma immagino getpid potrebbero rientrare in là altrettanto bene.
+1, domanda interessante! –
la domanda di implementazione di syscall: http://stackoverflow.com/questions/499188/how-is-the-system-call-in-linux-implemented – nik
votare me stesso per chiudere. anzi è duplicato (non è comparso sulla ricerca come ho usato syscall) –