Модуль ядра 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 МБ.

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