Реализация системных вызовов/ловушек в источнике ядра Linux
В настоящее время я изучаю использование операционными системами ловушек для облегчения системных вызовов в ядре Linux. Я нашел таблицу ловушек в traps.c и реализацию многих ловушек в пределах entry.S.
Однако мне поручено найти реализацию двух системных вызовов в ядре Linux, которые используют ловушки для реализации системного вызова. Хотя я могу найти определение самих ловушек, я не знаю, как будет выглядеть "вызов" одной из этих ловушек в ядре. Поэтому я пытаюсь найти пример такого поведения.
Прежде чем кто-нибудь спросит, да, это домашнее задание.
В качестве примечания я использую Github для просмотра исходного кода ядра, поскольку kernel.org не работает:
https://github.com/torvalds/linux/
Ответы
Ответ 1
Для архитектуры x86 прерывание SYCALL_VECTOR (0x80) используется только для 32-битных ядер. Макет вектора прерываний можно увидеть в arch/x86/include/asm/irq_vectors.h
. Функция trap_init()
из traps.c
- это та, которая устанавливает обработчик ловушки, определенный в entry_32.S
:
set_system_trap_gate(SYSCALL_VECTOR, &system_call);
Для 64-битных ядер новые версии SYSENTER (Intel) или SYSCALL (AMD) используются по соображениям производительности. Функция syscall_init()
из arch/x86/kernel/cpu/common.c
устанавливает "обработчик", определенный в entry_64.S
и имеющий одно и то же имя (system_call).
Для пользовательского пространства perspetive вы можете взглянуть на эту страницу (немного устаревший для имен функций/файлов).
Ответ 2
Мне поручено найти реализацию двух системных вызовов в ядре Linux, которые используют ловушки для реализации системного вызова
Каждый системный вызов использует ловушку (прерывание 0x80, если я правильно помню), поэтому бит "ядра" будет включен в PSW, а привилегированные операции будут доступны процессору.
Как вы упомянули, системные вызовы указаны в entry.S под sys_call_table:
, и все они начинаются с префикса "sys".
вы можете найти заголовок функции системного вызова в: include/linux/syscalls.h, вы можете найти его здесь:
http://lxr.linux.no/#linux+v3.0.4/include/linux/syscalls.h
Используйте lxr (как уже упоминалось выше), чтобы просмотреть исходный код.
Во всяком случае, функция реализуется с использованием SYSCALL_DEFINE1 или других версий макроса, см.
http://lxr.linux.no/#linux+v3.0.4/kernel/sys.c
Ответ 3
Если вы ищете фактический системный вызов, а не реализацию системного вызова, возможно, вы хотите проверить некоторые библиотеки C. Почему ядро включает системный вызов? (Я не говорю о реализации системного вызова, я говорю, например, о фактическом вызове chdir
, например. Системный вызов chdir
, который представляет собой запрос на изменение и существует реализация системного вызова chdir
, которая фактически меняет его и должна быть где-то в ядре). Хорошо, возможно, некоторые ядра также включают некоторые системные вызовы, но это другая история:)
В любом случае, если я правильно задаю вопрос, вы не ищете реализацию, а фактический вызов. GNU libc слишком сложна для меня, но вы можете попробовать просматривать источники dietlibc. Некоторые примеры:
chdir.S
syscalls.h