Данные ответы верны, но я хотел бы добавить, что для входа в режим ядра существует больше механизмов. Каждое новое ядро отображает страницу «vsyscall» в адресном пространстве каждого процесса. Он содержит немного больше, чем самый эффективный метод ловушки syscall.
Например, на обычной 32 битной системе может содержать:
0xffffe000: int $0x80
0xffffe002: ret
Но на моем 64-bitsystem у меня есть доступ к тому, как более эффективный метод, используя инструкции системных вызовов/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, время и getcpu сопоставляются, но я полагаю, GETPID может поместиться там точно так же.
+1, интересный вопрос! –
вопрос реализации syscall: http://stackoverflow.com/questions/499188/how-is-the-system-call-in-linux-implemented – nik
голосующий сам, чтобы закрыть. действительно, является дубликатом (не отображался при поиске, так как я использовал syscall) –