Резервная системная память, 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 не используют эту память.