Использование ioremap для резервирования времени загрузки памяти ядра

Во-первых, я должен признать, что я новичок. так что не иди на меня, плз. Я хочу зарезервировать память во время загрузки, а затем использовать эту память в модуле ядра, чтобы быть уверенным, что этот модуль является единственным, использующим это пространство. Я собираюсь так: добавьте mem = и memmap = в параметры kerenl, чтобы зарезервировать память @ время загрузки. мои вопросы начинаются здесь:

  1. если я использую ioremap над этим пространством в коде моего модуля, будет ли он доступен в других модулях? или другие подсистемы ядра все еще не видят этого?
  2. Второй вопрос: как я могу быть уверен, что эта зарезервированная память никогда не будет перемещаться в пространство подкачки?
  3. третий: как я могу получить доступ к этой памяти, как блочные устройства? я имею в виду, как /dev/sda или.....

3 ответа

Я думаю, что ioremap() без необходимости перетаскивается в обсуждении для резервирования памяти во время загрузки.

Лучше использовать (на самом деле чаще всего используется в ядре) следующий API

memblock_reserve(phys_addr_t base, phys_addr_t size)

проверьте файл memblock.c для большего понимания.

  1. ioremap для любого физического адреса, даст виртуальный адрес, который вы можете использовать, чтобы поместить туда некоторые данные.
  2. Несколько модулей могут отобразить эту область и переписать это все, что им нужно, это начальный адрес (физический) и размер
  3. Mem=/memmap= будет скрывать это от ядра Linux, поэтому нет необходимости выгрузки
  4. Так как область io, такая не кешируемая и некогерентная, будет атрибутом в большинстве архитектур

(1) Используя ioremapвы устанавливаете виртуальный адрес ядра для памяти. Любой другой код в пространстве ядра может получить к нему доступ, просто вставив правильное значение в переменную-указатель. AFAIK, нет способа "привязать" какую-либо область памяти к одному модулю ядра. Все части ядра являются всесильными и, следовательно, могут получать доступ к любой памяти, которая им нравится, или, по крайней мере, они могут выполнять все операции, которые могут потребоваться для предоставления им доступа к любой памяти, которая им нравится. По той же причине, нет никакой причины, что другой кусок кода ядра будет обращаться к памяти, если вы не вызываете это каким-либо образом. В конце концов, вы сказали остальной части ядра, что это не нормальная память.

(2) Исключая память из карты памяти ядра, затем используя ioremap вы фактически говорите ядру, что это какая-то специальная память ввода-вывода (например, область памяти ввода-вывода устройства PCI), и, следовательно, по этой причине не будут рассматриваться для подкачки страниц.

Я не знаю, каким образом вы можете достичь своей цели в (3) без реализации собственного интерфейса устройства для памяти. Однако, если это то, для чего вы хотите его использовать, почему бы просто не создать файловую систему ramdisk? Для этого не требуется (дополнительного) программирования ядра. (Увидеть Documentation/blockdev/ramdisk.txt в исходном дереве ядра.)

Другие вопросы по тегам