Выделение памяти для пользовательского пространства из потока ядра
-
06-07-2019 - |
Вопрос
Мой вопрос касается передачи данных из ядра в программу пользовательского пространства.Я хочу реализовать системный вызов "get_data(size, char *buff, char ** meta_buf)".В этом вызове buff выделяется программой пользовательского пространства, а его длина передается в аргументе size.Однако meta_buf - это буфер переменной длины, который выделяется (на страницах виртуальной машины программы user space) и заполняется ядром.Программа User space освободит этот регион.
(Я не могу разместить данные в пользовательском пространстве, так как программа пользовательского пространства не знает размер meta_buff.Кроме того, программа пользовательского пространства не может выделить фиксированный объем памяти и вызывать системный вызов снова и снова, чтобы прочитать все метаданные.meta_data должны быть возвращены в одном системном вызове)
- Как мне выделить память для программы пользовательского пространства из потока ядра?(Я был бы даже признателен, если бы вы могли указать мне на любой другой системный вызов, который выполняет аналогичную операцию - выделение в ядре и освобождение в пользовательском пространстве)
- Правильный ли это интерфейс или есть лучший способ сделать это?
Решение
Не пытайтесь выделять память для пользовательского пространства из ядра - это серьезное нарушение многоуровневой абстракции ядра.Вместо этого рассмотрите несколько других вариантов:
- Попросите пользовательское пространство спросить, сколько ему нужно места.Пользовательское пространство выделяет, а затем извлекает память из ядра.
- Разместите страницы mmap пользовательского пространства, принадлежащие вашему драйверу, непосредственно в его адресном пространстве.
- Установите верхнюю границу необходимого объема данных.Просто выделите столько-то.
Трудно сказать больше, не зная почему это должно быть атомарно.На самом деле выделение памяти в любом случае должно быть прерываемым (иначе вы вряд ли добьетесь успеха), так что маловероятно, что выход из ядра и возвращение обратно в ядро будут сильно болезненными.На самом деле, Любой запись в память пользовательского пространства должен будьте прерываемы, так как возможны сбои страницы, требующие ввода-вывода.