2014-01-20 2 views
0

Я разрабатываю базовый гипервизор на ARM (используя плату Arndale Exynos 5250). Я хочу загрузить Linux (ubuntu или smth else)/Android в качестве гостя. В настоящее время я использую дистрибутив Linaro.ARM: безопасная позиция физической памяти (для резервирования) для моего гипервизора ARM относительно гостя Linux/Android

Я почти там, большинство из больших проблем уже было рассмотрено, за исключением последней, кроме: оговорку памяти для моего гипервизора таким образом, что ядро ​​не попытки перезаписать его ПЕРЕД разбора FDT или командной строки ядра.

Проблема заключается в том, что мой дистрибутив Линаро в U-Boot проходит FDT в R2 с Linux ядра, но ядро ​​пытается перезаписать память моего гипервизор, прежде чем увидеть, что я зарезервировал эту область памяти в FDT (по декомпиляция DTB, изменение DTS и перекомпиляция его). Я попытался изменить параметры командной строки ядра, но они также анализируются ПОСЛЕ того, как ядро ​​пытается перезаписать мою зарезервированную часть памяти.

Таким образом, мне нужна безопасная ячейка памяти в физической памяти, где можно поставить код моего гипервизора таким образом, чтобы ядро ​​Linux не пыталось получить доступ (r/w) до того, как разбор FDT или его ядра командная строка.

Контекст деталь:

  • Компоновка системы ОЗУ на Exynos 5250 является: физическая память начинается с 0x4000_0000 (= 1 Гб) и имеет длину 0x8000_0000 (= 2 Гб).
  • Ядро Linux загружается (с помощью U-Boot) при 0x4000_7000, это размер (несжатый uImage) меньше, чем 5MB и это точка входа устанавливается, чтобы быть в 0x4000_8000;
  • uInitrd загружается при 0x4200_0000 и имеет размер меньше, чем 2MB
  • ПТД (board.dtb) загружают в 0x41f0_0000 (принят в R2) и имеет размер меньше 35KB
  • в настоящее время я загрузить мой гипервизор на 0x40C0_0000 и я хочу, чтобы зарезервировать 200MB (0x0C80_0000), начиная с этого а ddress, но ядро ​​пытается там написать (), а второй HYP-ловушка уровня 2 сообщает мне, что) перед тем, как смотреть в FDT или в командной строке, чтобы увидеть, что регион действительно зарезервирован. Если вместо этого я загружу свой гипервизор в 0x5000_0000 (даже не изменяя оригинальный DTB или командную строку), он не пытается перезаписать меня!
  • ПТД передается непосредственно, а не через ATAGs

Поскольку при загрузке моего гипервизор на 0x5000_0000 ядро ​​не пытается переписать его вообще, я предполагаю, что есть области памяти, что Linux делает не касаться перед парсингом FDT/командной строки. Мне нужно знать, верно это или нет, и если это правда, некоторые подробности относительно этих областей памяти.

Спасибо!

СОПУТСТВУЮЩИЕ ВОПРОС:

Кто-нибудь случиться, чтобы знать, что является приоритетом между следующими: ATAGs/ядра командной строки/FDT? Например, если я оставляю памяти через ядра командной строки, но не в FDT (.dtb) она должна работать или в командной строке перекрываться в FDT? Есть ли какое-то отношение между этими тремя?

+1

Если U-Boot может перезаписать ваш гипервизорный код, то вы еще не совсем там. Вы должны сначала сосредоточиться на этом: не должно быть возможным, чтобы гостевая среда выполнения изменяла гипервизор. Пересмотреть дизайн изоляции памяти. –

+0

Я не сказал, что U-Boot - это тот, который перезаписывает мой гипервизор :) Это ядро ​​Linux. Мой гипервизорный код выполняет BETWEEN u-boot (гипервизор загружается u-boot), а ядро ​​(гипервизор загружает linux).И дело не в том, что оно на самом деле перезаписывает его, просто он пытается (очевидно, в результате попадает в HYP-ловушку) –

+0

Хорошо, мое недоразумение, поэтому кажется, что изоляция памяти в порядке. Но тогда вы не настроили гостевое адресное пространство так, чтобы 0x40000000 отображался на 0x0c800000? –

ответ

0

В соответствии с https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/arm/Booting, безопасные места начать 128 от начала RAM (в предположении, что ядро ​​загружается в той области, которая должна быть). Если zImage был загружен ниже в памяти, чем то, что, вероятно, будет конечным адресом распакованного изображения, оно может переместиться выше, прежде чем оно начнет декомпрессию. Но в дополнение к этому, ядро ​​имеет область .bss за пределами декомпрессированного изображения в памяти.

(Не стоит также отметить, что ваш FDT и INITRD мест уже нарушают эту спецификацию, и блок памяти, вы желаете, чтобы резерв покрывает расположение обоих из них.)

Эффективно, ваша зарезервированная область должна идти после того, как FDT и initrd в памяти - 0x50000000. Но ничего> 0x08000000 от начала ОЗУ должно работать, переносимо, если это не перезаписывает FDT, initrd или U-Boot в памяти.

+0

проклятье! Я не знаю, как я этого не понимал раньше, но я помню, как вычислял адрес моего HYP NOT TO наложения initrd и FDT; Теперь я понимаю, что мои расчеты были очень неправильными; Я также прочитал этот документ, прежде чем публиковать его, и именно поэтому я позиционировал его на уровне 0x5000_0000 (после initrd и FDT), но мне показалось странным, что ядро ​​не пыталось писать там, даже если Я не изменял исходный FDT и initrd; Я все еще смущен этим, я объясню, почему в комментарии ниже –

+0

так ... вы говорите, что места FDT и initrd нарушают рекомендуемую спецификацию mem-layout, но я не выбрал места в памяти ни одного из них (uImage, initrd и FDT расположены в местах, где они были размещены с помощью u-boot в предварительно подготовленном linaro-изображении UNTOUCHED); Кроме того, есть еще одна вещь, которая меня беспокоит; Я также попытался позиционировать свой HYP чуть ниже верхней части ОЗУ (по адресу (3 ГБ-200 МБ), оперативная память начинается с 1 ГБ и имеет размер 2 ГБ); но Linux тоже пытается писать там ... таким образом, мне не показалось, что вещь «ABOVE ram base + 128MB» все еще сохраняется .. –

+0

в первом комментарии я имел в виду «даже если бы я не изменял оригинал FDT и/или командная строка ядра " –

0

Приоритет командной строки ядра/FDT/bootloader зависит от конфигурации ядра - выполните команду menuconfig и установите флажок «Параметры загрузки». Вы можете комбинировать ATAGS со встроенными командами, но не с FDT. В конце концов, узел FDT chosen должен быть сгенерирован загрузчиком. Поддержка FDT U-boot в порядке, поэтому вы должны позволить этому сделать это, а не выпекать его в .dts, если вы хотите использовать командную строку FDT.

Ядро довольно консервативно, прежде чем у него есть карта памяти, поскольку он должен вслепую доверять загрузчику. U-boot, с другой стороны, копирует биты самого себя по всему месту и, безусловно, является виновником верхнего предела ОЗУ - если вы #define DEBUG в (я думаю) common/board_f.c, вы получите свалку того, что он нажимает во время перемещения (не включая Exynos iRAM SPL/загрузочный код, но в любом случае это не будет иметь никакого значения).

Смежные вопросы