Подтвердить что ты не робот

Реализация системных вызовов/ловушек в источнике ядра Linux

В настоящее время я изучаю использование операционными системами ловушек для облегчения системных вызовов в ядре Linux. Я нашел таблицу ловушек в traps.c и реализацию многих ловушек в пределах entry.S.

Однако мне поручено найти реализацию двух системных вызовов в ядре Linux, которые используют ловушки для реализации системного вызова. Хотя я могу найти определение самих ловушек, я не знаю, как будет выглядеть "вызов" одной из этих ловушек в ядре. Поэтому я пытаюсь найти пример такого поведения.

Прежде чем кто-нибудь спросит, да, это домашнее задание.

В качестве примечания я использую Github для просмотра исходного кода ядра, поскольку kernel.org не работает: https://github.com/torvalds/linux/

4b9b3361

Ответ 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