Реализация системных вызовов / ловушек в ядре Linux - PullRequest
13 голосов
/ 13 сентября 2011

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 14 сентября 2011

Для архитектуры 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 ).

В отношении пространства пользователя вы можете взглянуть на эту страницу (немного устаревшая для имен функций / файлов).

0 голосов
/ 14 сентября 2011

Если вы ищете реальный системный вызов, а не реализацию системного вызова, возможно, вы хотите проверить некоторые библиотеки Си. Зачем ядру включать системный вызов? (Я не говорю о реализации системного вызова , я говорю, например, о фактическом chdir вызове, например. Существует системный вызов chdir , который запрос на изменение каталога и chdir реализация системного вызова , которая фактически изменяет его и должна быть где-то в ядре). Хорошо, возможно, некоторые ядра тоже включают некоторые системные вызовы, но это другая история:)

В любом случае, если я правильно понял ваш вопрос, вы ищете не реализацию, а реальный вызов. GNU libc слишком сложен для меня, но вы можете попробовать просмотреть источники dietlibc. Некоторые примеры:

chdir.S

syscalls.h

0 голосов
/ 14 сентября 2011

Мне поручено найти реализацию двух системных вызовов в ядре 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

...