Приведенные ответы верны, но я хотел бы добавить, что есть больше механизмов для входа в режим ядра. Каждое последнее ядро отображает страницу «vsyscall» в адресное пространство каждого процесса. Он содержит чуть больше, чем самый эффективный метод захвата системных вызовов.
Например, в обычной 32-битной системе оно может содержать:
0xffffe000: int $0x80
0xffffe002: ret
Но на моей 64-битной системе у меня есть доступ к более эффективному методу, использующему инструкции 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
Эта страница vsyscall также отображает некоторые системные вызовы, которые могут быть выполнены без переключения контекста. Я знаю, что gettimeofday , time и getcpu сопоставлены там, но я думаю, что getpid может вписаться туда также *