Выделение памяти для пользовательского пространства из потока ядра - PullRequest
5 голосов
/ 26 октября 2009

Мой вопрос касается передачи данных из ядра в программу пространства пользователя. Я хочу реализовать системный вызов "get_data (size, char * buff, char ** meta_buf)". В этом вызове buff выделяется программой пользовательского пространства, а его длина передается в аргументе size. Однако meta_buf - это буфер переменной длины, который выделяется (на страницах vm программы пользовательского пространства) и заполняется ядром. Пользовательская космическая программа освободит этот регион.

(Я не могу выделить данные в пространстве пользователя, так как программа пространства пользователя не знает размер meta_buff. Кроме того, программа пространства пользователя не может выделить фиксированный объем памяти и снова и снова вызывать системный вызов для чтения всех метаданных. meta_data должна быть возвращена за один системный вызов)

  1. Как выделить память для программы пространства пользователя из потока ядра? (Я был бы даже признателен, если бы вы указали мне на любой другой системный вызов, который выполняет аналогичную операцию - выделение в ядре и освобождение в пользовательском пространстве)
  2. Этот интерфейс правильный или есть лучший способ сделать это?

1 Ответ

11 голосов
/ 26 октября 2009

Не пытайтесь выделять память для пространства пользователя из ядра - это огромное нарушение уровня абстракции ядра. Вместо этого рассмотрим несколько других вариантов:

  • Пусть пользовательское пространство спросит, сколько места ему нужно. Пользовательское пространство выделяет, а затем захватывает память из ядра.
  • Пусть пользовательские страницы mmap принадлежат вашему драйверу непосредственно в его адресное пространство.
  • Установите верхнюю границу количества необходимых данных. Просто выделите столько.

Трудно сказать больше, не зная , почему это должно быть атомно. На самом деле распределение памяти в любом случае должно быть прерываемым (или вы вряд ли добьетесь успеха), поэтому маловероятно, что выход из ядра и обратно в него сильно повредит. Фактически, любая запись в память пространства пользователя должна быть прерываемой, поскольку существует вероятность ошибок страниц, требующих ввода-вывода.

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