Сделать непрерывную область в пространстве ядра - PullRequest
1 голос
/ 04 февраля 2012

Я выделяю память на alloc_page(GFP_USER), и я выделил более одной страницы.Мне нужно сделать так, чтобы я видел его как непрерывную область (мне нужно сделать из него буфер), поэтому я хочу отозвать к нему *(vm_beg + off).

Я знаю, что это возможно mmap в пользователепространство, но как я могу сделать это в пространстве ядра?

1 Ответ

5 голосов
/ 04 февраля 2012

Если вам нужно выделить виртуально непрерывной памяти, то вы можете использовать vmalloc() для этого (подробнее здесь ). Однако фактическая физическая память может быть разбросана, поэтому, если вы планируете использовать этот буфер с некоторым аппаратным блоком (например, DMA, шина PCI) вне вашего MMU ЦП, тогда vmalloc() может оказаться не лучшим выбором.

Вы, вероятно, должны использовать kmalloc() для большинства целей (больше информации здесь ). Разница в том, что vmalloc() всегда будет изменять таблицы страниц, чтобы получить новую память (немного похоже на mmap() в пользовательском пространстве). Другое отличие состоит в том, что kmalloc() дает вам физически непрерывную память и обычно быстрее, чем vmalloc(), который всегда должен изменять таблицы страниц.

Очень хорошим источником информации о памяти Linux является Драйверы устройств Linux 3 (в частности, глава 15 в вашем случае), вы, вероятно, найдете ответ на большинство ваших вопросов внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...