Резервная системная память, ioremap()?

Плохо ли звонить ioremap() по системе DRAM. Я хотел бы зарезервировать место в системе DRAM, которое не будет использоваться никаким другим процессом. Будет ли это способ сделать это? Я знаю, что DRAM на самом деле не является памятью ввода-вывода, поэтому я не был уверен, считается ли это плохой практикой.

2 ответа

Разве плохо вызывать ioremap () на системной DRAM.

Системная память, которой управляет ядро, также не должна быть переназначена с помощью ioremap (). Эти множественные сопоставления могут привести к повреждению данных на некоторых архитектурах / процессорах. Обратитесь к этой статье по этому вопросу для ARM.

Вы можете попытаться обеспечить одно отображение (используя ioremap ()), исключив область памяти, о которой идет речь, во время загрузки из управления ядра.
На ARM укажите уменьшенную физическую память, используя ATAG (ATAG_MEM теги или дерево устройств (memory имущество).
В противном случае используйте параметр memmap = kernel в командной строке ядра:

1835         memmap=nn[KMG]$ss[KMG]
1836                         [KNL,ACPI] Mark specific memory as reserved.
1837                         Region of memory to be reserved is from ss to ss+nn.
1838                         Example: Exclude memory from 0x18690000-0x1869ffff
1839                                  memmap=64K$0x18690000
1840                                  or
1841                                  memmap=0x10000$0x18690000

Область памяти также должна быть объявлена ​​с помощью request_mem_region() для предотвращения множественных запросов и для полноты / точности / proc / iomem.

Память может быть зарезервирована во время загрузки системы, используя "mem" в аргументе командной строки ядра.

ЛДД3 Ч-15 Пг 443

Например, если у вас есть 256 МБ, аргумент mem=255M не позволяет ядру использовать верхний мегабайт. Ваш модуль может позже использовать следующий код для получения доступа к такой памяти:

dmabuf = ioremap (0xFF00000 / * 255M /, 0x100000 / 1M * /);

Однако это не эффективный способ сделать это, так как ядро ​​не может использовать эту зарезервированную память. На SoC, на котором я сейчас работаю, память зарезервирована с помощью CMA, который позволяет повторно использовать память другими процессами, когда драйверы SoC не используют эту память.

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