Las respuestas dadas son correctas, pero me gustaría agregar que hay más mecanismos para ingresar al modo kernel. Cada núcleo reciente mapea la página "vsyscall" en el espacio de direcciones de cada proceso. Contiene poco más que el método de captura de syscall más eficiente.
Por ejemplo, en un sistema regular de 32 bits podría contener:
0xffffe000: int $0x80
0xffffe002: ret
Pero en mi 64 bitsystem tengo acceso a la forma del método más eficiente el uso de las instrucciones 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
Esta página vsyscall también mapea algunas llamadas al sistema que se pueden realizar sin un cambio de contexto. Sé cierta gettimeofday, tiempo y getcpu se asignan allí, pero me imagino GETPID podrían caber allí igual de bien.
+1, pregunta interesante! –
la pregunta de implementación de syscall: http://stackoverflow.com/questions/499188/how-is-the-system-call-in-linux-implemented – nik
votando yo mismo para cerrar. de hecho es duplicado (no apareció en la búsqueda como usé syscall) –