Как использовать memmap с U-Boot?

Вопрос или проблема

Я хотел бы зарезервировать первые 2 ГБ оперативной памяти, потому что моя аппаратная часть записывает в эту область памяти RAM, и мне нужно, чтобы ядро не трогало эту часть памяти.

Я прочитал, что для использования этой опции нужно запустить команду memmap в загрузчике, и загрузчик, который я использую, это U-Boot, потому что я разрабатываю драйвер-ядро в Yocto OS.

Я прочитал, что для примера использования memmap:

memmap=nn[KMG]$ss[KMG]
    [KNL,ACPI] Отметить конкретную память как зарезервированную.
    Область памяти, которая будет зарезервирована, от ss до ss+nn.
    Пример: Исключить память с 0x18690000 по 0x1869ffff
             memmap=64K$0x18690000
             или
             memmap=0x10000$0x18690000
    Некоторые загрузчики могут требовать символescape перед '$', 
    например, Grub2, в противном случае '$' и следующее число 
    будут проигнорированы.

И я не знаю, как использовать это в данном случае, спасибо.

ИЗМЕНЕНИЕ: Новый вопрос

Я написал эту опцию в U-Boot, используя memmap=2G$0x00000000 и memmap=7fffffff$0x00000000, исключения не возвращаются.
Я полагаю, что написал это правильно, но в cat / proc / iomem я не вижу ничего, что говорит мне, что эта память зарезервирована.

Нужно ли изменять .dtb?

Я думаю, вам лучше использовать атрибут “mem” в U-Boot во время загрузки, смотрите здесь:

Чтобы зарезервировать память, чтобы она не использовалась Linux, работающим на SoC Cortex-A9, ядру Linux необходимо сообщить, какой адрес является верхним адресом памяти (наивысший адресуемый адрес оперативной памяти). Все адреса оперативной памяти за пределами этого адреса могут быть использованы для других целей вне операционной системы Linux.

Наивысший адресуемый адрес оперативной памяти можно установить в U-Boot, добавив аргумент загрузки “mem=…” в переменную окружения bootargs U-Boot.

Ниже приведен пример команды командной строки U-Boot для установки верхнего адреса памяти на 0x3E800000:

setenv bootargs console=ttyS0,115200 mem=1000M

Обратите внимание, что переменные окружения U-Boot “mmcboot”, “ramboot” и “qspiboot” также переопределяют переменную окружения bootargs. Если использовать эти переменные, переменную bootargs также может потребоваться изменить внутри этих переменных.

Переменные окружения по умолчанию в U-Boot определены для SoC в заголовочном файле C “uboot-socfpga\include\configs\socfpga_common.h”.

Ответ или решение

Для резервирования определенного объема памяти в U-Boot и предотвращения доступа к этой памяти со стороны ядра Linux, вы можете использовать параметры для настройки параметров загрузки. Ваша задача заключается в том, чтобы указать, какая часть оперативной памяти должна быть недоступна для операционной системы, и это можно сделать с помощью команды memmap в U-Boot.

Использование memmap в U-Boot

Для резервирования первого 2 ГБ оперативной памяти вы можете использовать команду memmap, чтобы явно указать область памяти, которую нужно исключить из использования ядром Linux.

Пример команды в U-Boot для резервирования первого 2 ГБ:

memmap=2G$0x00000000

Однако в некоторых случаях использование memmap может не дать ожидаемых результатов, поэтому важно правильно настроить параметры загрузки.

Установка параметра mem в U-Boot

Сначала внимательно проверьте, как передаются параметры загрузки в ядро Linux. Для того чтобы коректно указать самое высокое адресуемое значение памяти, используйте параметр mem в строке загрузки. Пример, как это сделать:

setenv bootargs console=ttyS0,115200 mem=2G

Эта команда устанавливает верхний предел адресуемой памяти на 2 ГБ.

Важно: Убедитесь, что вы также проверяете другие переменные загрузки, такие как mmcboot, ramboot и qspiboot, так как они могут переопределять переменную bootargs. Соответственно, убедитесь, что все нужные параметры корректно настроены.

Проверка результатов

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

cat /proc/iomem

Если вы не видите зарезервированную область памяти, это может означать, что необходимо дополнительно настроить файл Device Tree Blob (.dtb).

Необходимость изменения .dtb

Если после внесения изменений в параметры загрузки информация о зарезервированной памяти не отображается, возможно, вам придется внести соответствующие изменения в файл Device Tree. В этом файле вы можете явным образом указать, какие области памяти должны быть зарезервированы для других целей. Используйте секцию reserved-memory и укажите область, которую необходимо зарезервировать.

Пример изменения .dtb:

reserved-memory {
    #address-cells = <1>;
    #size-cells = <1>;

    reserved: memory@0x00000000 {
        reg = <0x00000000 0x80000000>;  // Резервирование 2 GB с адреса 0
    };
};

Заключение

С помощью описанных выше шагов, вы сможете правильно зарезервировать необходимую область памяти в U-Boot для вашего программного обеспечения. Убедитесь, что как параметры memmap, так и mem корректно настроены и, при необходимости, внесите изменения в файл Device Tree для конфигурации резервируемой памяти.

Оцените материал
Добавить комментарий

Капча загружается...