Комментарии 3
Третья, заключительная часть цикла, по ссылке: https://habr.com/ru/companies/yadro/articles/860428/
Device tree который вы предлагаете на практике может давать проблемы, по крайней мере с ядром 5.19 и zynq7k. Если не замапить его на драйвер (к примеру uio), то ядро Linux включает его в CMA memory pool, и некоторые драйвера могут начать его использовать. Закономерно испортив память. Отвалится и хост arm и софтпроцессор.
Возможно у вас памяти слишком много и этот эффект не заметен. Для теста попробуйте занулить из arm весь зарезервированный регион.
Я так полагаю, что речь идет о devicetree для Hard-CPU и ноде reserved-memory.
По идее, зарезервированный регион не должен нигде использоваться, если этого явно не указано. Например, для использования региона каким-либо драйвером, в его описании devicetree можно указать следущее:
memory-region = <&reserved>;
Таким образом драйвер будет явно привязан к этому региону по тегу.
Для того, чтобы использовать регион через DMA API, нужно назначить ему стандартный драйвер через:
compatible = "shared-dma-pool";
В случае с CMA, также указать:
linux,cma-default;
Вожможно, у вас в devicetree есть некое наложение по тегу региона или адресу. Попробуйте переименовать регион с "reserved"
на что-нибудь другое, например "mb-reserved"
.
Что касается адреса, я описывал детально как выбирал его для конкретной платформы в первой части. В вашем случае он может отличаться, и, вероятно, должен отличаться, чтобы соответствовать иным требованиям.
Тест с затиранием памяти понятен. Конечно, если нарушить код загруженной ОС, или данные региона памяти, выделенного тому или иному драйверу, все пойдет не по лучшему сценарию. В тексте я делал акцент на важности исключения совместного использования региона обеими ОС. В вашем случае интересно разобраться все же почему зарезервированный регион попал в ведение ОС Hard-CPU.
Запускаем Embedded Linux на Hard- и Soft-CPU Xilinx Zynq: сборка операционной системы