Поскольку, как упоминалось в книге Понимание ядра Linux , обычный ввод-вывод (без O_DIRECT
) будет выполнять копирование данных с помощью функции вызова copy_to_user()
или copy_from_user()
. Таким образом, кроме access_ok()
, более полная проверка параметров пользовательских адресов выполняется с помощью механизма, названного (в книге) «Динамическая проверка адресов: код исправления», который представлен ниже:
адрес ПК точной инструкции копирования внутри copy_to_user () или
copy_from_user () устанавливаются в __ex_table, когда есть ошибка
ввод адреса пользователя через системный вызов, обработчик ошибок страницы
сделает проверку ниже, чтобы системный вызов был более безопасным:
-----------------------
if PC is in __ex_table then just kill the user program
else kernel panic
-----------------------
У меня вопрос, поскольку O_DIRECT
в основном не выполняет копирование пользователя / ядра, поэтому он может быть менее безопасным с точки зрения ядра, поскольку в нем отсутствует вышеупомянутая динамическая проверка адресов?
Спасибо за помощь.
Edit:
Согласно ответу Цыварева, «менее безопасный» может быть не очень точным, мой вопрос может быть сформулирован так:
Когда программа выполняет прямой ввод-вывод и предоставляет неправильный адрес, то в каких случаях произойдет следующее:
- программа будет убита (так как программа без O_DIRECT будет убита, поэтому, если программа с O_DIRECT не будет убита, я подумал, что это не так безопасно в моем верхнем вопросе)
- или ядро будет просто паниковать
- или ничего не делать
Возможно, мой вопрос слишком специфичен для кода, и мне нужно провести несколько экспериментов и чтение кода, чтобы найти ответ сам :)
спасибо