Является ли IO с O_DIRECT менее безопасным из-за отсутствия проверки адреса? - PullRequest
0 голосов
/ 16 марта 2019

Поскольку, как упоминалось в книге Понимание ядра 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:

Согласно ответу Цыварева, «менее безопасный» может быть не очень точным, мой вопрос может быть сформулирован так: Когда программа выполняет прямой ввод-вывод и предоставляет неправильный адрес, то в каких случаях произойдет следующее:

  1. программа будет убита (так как программа без O_DIRECT будет убита, поэтому, если программа с O_DIRECT не будет убита, я подумал, что это не так безопасно в моем верхнем вопросе)
  2. или ядро ​​будет просто паниковать
  3. или ничего не делать

Возможно, мой вопрос слишком специфичен для кода, и мне нужно провести несколько экспериментов и чтение кода, чтобы найти ответ сам :) спасибо

...