Выделение памяти для пользовательского пространства из потока ядра

StackOverflow https://stackoverflow.com/questions/1623008

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

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

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top