Книга: Разработка ядра Linux
Определение необходимого системного вызова
Определение необходимого системного вызова
Простой переход в пространство ядра сам по себе не является достаточным, потому что существует много системных вызовов, каждый из которых осуществляет переход в режим ядра одинаковым образом. Поэтому ядру должен передаваться номер системного вызова.
Для аппаратной платформы x86 номер системного вызова сохраняется в регистре процессора eax
перед тем, как вызывается программное прерывание. Обработчик системных вызовов после этого считывает это значение из регистра eax
. Для других аппаратных платформ выполняется нечто аналогичное.
Функция system_call()
проверяет правильность переданного номера системного вызова путем сравнения его со значением постоянной NR_syscalls
. Если значение номера больше или равно значению NR_syscalls
, то функция возвращает значение -ENOSYS
. В противном случае вызывается соответствующий системный вызов следующим образом:
call *sys_call_table(,%eax,4)
Так как каждый элемент таблицы системных вызовов имеет длину 32 бит (4 байт), то ядро умножает данный номер системного вызова на 4 для получения нужной позиции в таблице системных вызовов (рис. 5.2).
Рис. 5.2. Запуск обработчика системных вызовов и выполнение системного вызова
- Высокоуровневое определение ADO.NET
- Определение показателей значимости
- Определение ассортиментной и ценовой политики
- 10.1. Определение регулярных выражений
- Определение функции с аргументом: формальные аргументы
- Рис. 22. Определение объема жесткого диска.
- Рис. 26. Задняя панель системного блока.
- 21.6. Команды системного администратора
- Шаг 7. Определение необходимых ресурсов
- Определение членов типов в CIL
- 8.1. Определение функций
- Уменьшение времени, необходимого для резервного копирования и восстановления