Почему требуется copy_to / from_user? - PullRequest
5 голосов
/ 09 ноября 2010

В соответствии с дизайном Linux на x86 и PPC, виртуальное адресное пространство 4g разделено на 3: 1.Виртуальные адреса пользователей до 3 г.

Теперь, если пользовательское приложение выполняет ioctl, передавая указатель на буфер, модуль ядра может напрямую создавать memcpy, я попытался, и это сработало.=> Зачем тогда нам нужен пользователь copy_to / copy_from.

Примечание. Если страница выгружается из памяти, обработчик страницы-ошибки ядра возвращает ее, и она невидима для модуля ядра.1006 * нужны ваши идеи ... комментарии

Ответы [ 2 ]

9 голосов
/ 09 ноября 2010

Существует несколько веских причин, по которым copy_to_user / copy_from_user являются правильными функциями:

  • На некоторых архитектурах простой memcpy() работает , а не , поэтому использование этих функций позволяет вашему коду работать там. Я думаю, что даже x86 с выбранной опцией конфигурации HIGHMEM находится в этой лодке.

  • Эти функции проверяют access_ok(), чтобы убедиться, что адреса пространства пользователя, на которые действительно ссылаются , являются подлинными адресами пространства пользователя. Если вы просто выполните memcpy(), вызывающий ioctl() может предоставить диапазон адресов, который перекрывает адреса ядра, что является дырой в безопасности.

  • Однако причина major заключается в том, чтобы правильно обрабатывать неправильные адреса пользователей. Если вы просто используете memcpy(), необработанная ошибка приведет к сбою ядра. Функции доступа пользователя используют механизм «fixup» , который позволяет обрабатывать ошибку (чтение или запись короткие, и в этом случае обычно EFAULT возвращается в пространство пользователя).

0 голосов
/ 09 ноября 2010

Вам повезло, что это сработало.

Пространство пользователя и пространство ядра работают в совершенно разных адресных пространствах.Когда вы copy_to_user, ядро ​​преобразует виртуальный адрес пространства пользователя в реальный физический адрес и копирует туда данные.Подобный процесс происходит наоборот.

Можно пропустить копию непосредственно к шагам / с шагов, если ваше оборудование поддерживает DMA-анализ разброса / сбора.Здесь вы отображаете непрерывный кусок виртуальной памяти в ряд физических страниц, а затем используете эту информацию для прямого доступа к памяти непосредственно в пространство пользователя.Конечно, это может осложнить ситуацию, если какое-либо виртуальное адресное пространство в настоящее время не сопоставлено с физической памятью (например, подкачка или файлы с поддержкой файлов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...