Какой процесс Linux обрабатывает системные вызовы?

Это может быть глупый вопрос, но я отлаживал двоичный файл с помощью gdb, пытаясь «перепроектировать» его, и получил инструкцию, которая выполняет системный вызов, после чего появляется эффект, который я хочу перепроектировать. Я предполагаю, что другой процесс берет на себя и выполняет эту работу, поэтому мне было интересно, можно ли отладить код ядра, который обрабатывает системный вызов с помощью gdb.

Вот фрагмент сборки x86, который выполняет системный вызов (похоже, это sys_getpid):

0x00007ffff7660d3e <+14>:   movsxd rdx,edx
0x00007ffff7660d41 <+17>:   movsxd rdi,edi
0x00007ffff7660d44 <+20>:   mov    eax,0x14
0x00007ffff7660d49 <+25>:   syscall 

person stanm    schedule 05.04.2014    source источник


Ответы (1)


Машинная инструкция syscall (или sysenter или int 0x80 и т. д.) предназначена для выполнения системных вызовов, которые по определению обрабатываются ядром Linux. Подробности определены в спецификации x86-64 ABI. Прочтите Продвинутое программирование в Linux, чтобы получить обзор большинства из них. См. также инструкции по сборке Linux.

С точки зрения пользовательского приложения системный вызов — это виртуальная атомарная инструкция.

Никакой конкретный пользовательский процесс не обрабатывает системные вызовы, это работа ядра по их обработке, и это почти единственный способ взаимодействия приложения с ядром.

обработка системных вызовов ядром для данного процесса учитывается как системное процессорное время, т.е. по времени(1)

Список задокументированных системных вызовов приведен в syscalls(2). См. также заголовки <asm/unistd.h> и <asm/unistd_64.h> и т. д.

Вы можете использовать strace(1), чтобы понять последовательность системных вызовов выполняется конкретным запуском (некоторого процесса).

См. также vdso(7).

person Basile Starynkevitch    schedule 05.04.2014