На 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? */
- Это 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