Модуль ядра Linux: как выделить буфер (предназначенный для использования mmap) с помощью kzalloc и GFP_DMA?Linux

Ответить Пред. темаСлед. тема
Anonymous
 Модуль ядра Linux: как выделить буфер (предназначенный для использования mmap) с помощью kzalloc и GFP_DMA?

Сообщение Anonymous »

Модуль ядра Linux: как выделить буфер (предназначенный для использования mmap) с помощью kzalloc и GFP_DMA?
На kzalloc , документ небольшой: https://www.kernel.org/doc/html/v5.0/co ... #c.kzalloc.
Я знаю, что GFP_DMA необходимо использовать для обеспечения непрерывной памяти как в физическом, так и в виртуальном пространстве (что обязательно для последующего использования с mmap).
Вот https://www.oreilly.com/library/view/li ... 13s02.html можно прочитать: «Еще одно ограничение mmap заключается в том, что отображение является детализированным PAGE_SIZE. Ядро может распоряжаться виртуальными адресами только по адресу поэтому уровень таблиц страниц отображаемая область должна быть кратна PAGE_SIZE и должна находиться в физической памяти, начиная с адреса, кратного PAGE_SIZE."
Во всех примерах использования mmap в модуле ядра Linux, которые я искал/видел, я находил такие вещи, как:

mmap_buffer = kzalloc(PAGE_SIZE, GFP_DMA);

или

mmap_buffer = kzalloc( 4*PAGE_SIZE, GFP_DMA);

Кажется, всегда выделяется фиксированное количество PAGE_SIZE.
Теперь в моем случае мне нужен mmap_buffer для представления структуры. Вопрос: это правильно?

Код: Выделить всё

struct s {
uint16_t a;
uint16_t b;
}
...
mmap_buffer = kzalloc(sizeof(struct s), GFP_DMA); /* Is this correct? */
В итоге у меня 2 вопроса:
  • Это mmap_buffer = kzalloc(sizeof(struct s), GFP_DMA ); правильно? Если поставить этот вопрос по-другому: чтобы распределение было правильным, обязан ли я выделить фиксированное количество страниц таким образом?

Код: Выделить всё

   size_t N = sizeof(struct s) / PAGE_SIZE + 1; /* exact count of PAGE_SIZE for s */
mmap_buffer = kzalloc(N*PAGE_SIZE, GFP_DMA);
  • Как я могу убедиться, что "сопоставленная область должна находиться в физической памяти, начиная с адреса, кратного PAGE_SIZE", как уже упоминалось выше? kzalloc уже застраховал меня от этого? Должен ли я самостоятельно принудительно выполнить выравнивание, и если да, то как?


Подробнее здесь: https://stackoverflow.com/questions/790 ... ap-with-kz
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как использовать kzalloc и GFP_DMA для выделения буферов для mmap в модулях ядра Linux?
    Anonymous » » в форуме Linux
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Отрицательный счетчик ссылок после запуска cudaHostRegister-cudaHostUnregister в зоне DMA с использованием mmap (результ
    Anonymous » » в форуме C++
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous
  • В чем разница между «mmap.mmap» и «tempfile.SpooledTemporaryFile» в stdlib Python?
    Anonymous » » в форуме Python
    0 Ответы
    46 Просмотры
    Последнее сообщение Anonymous
  • MMAP с фиксированным адресом MMAP CALL SEGFAULT при вызове из MAIN, но работает внутри Custom Malloc переопределение в C
    Anonymous » » в форуме C++
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Ядра Linux: выделить огромный буфер
    Anonymous » » в форуме Linux
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Linux»