Как включить MMU в среде «голого железа» на базе ARMv8A TF-A

Недавно я включил MMU на более низких уровнях EL (EL1/EL0) в нашей тестовой среде ARMv8A на «голом железе», которая работает поверх TF-A. Включение MMU требует создания таблиц перевода, которые представляют собой сильно отформатированный набор данных, и его сложно создать с нуля. Оказалось, что библиотека TF-A имеет очень хорошо оснащенный набор функций, облегчающих создание этих таблиц для любого режима трансляции и позволяющих включить MMU. Но мне потребовалось некоторое время, чтобы добраться до нужной последовательности. Поэтому я задаю этот вопрос и отвечаю на него своим собственным ответом. Я хочу, чтобы этот вопрос был легким ответом для людей, ищущих ту же информацию, что быстро направит их в правильном направлении и, надеюсь, сэкономит некоторое время.

Это было бы полезно для разработчиков, которые хотят создавать свои собственные таблицы MMU, используя библиотеку TF-A для пользовательских целей. Для этой темы есть предоставленная ARM документация, которая очень хороша. Этот ответ призван стать отправной точкой, указывающей на все необходимые концепции для выполнения задачи.

Имена функций и макросов могут измениться в будущем выпуске TF-A, но я ожидаю, что используемые концепции останутся неизменными.


person Ganesh Garga    schedule 25.08.2020    source источник


Ответы (1)


Ниже приведены шаги, которые можно выполнить, чтобы использовать библиотеку TF-A для создания необходимых таблиц перевода и включения MMU.

Необходимые понятия –

  1. Основная концепция, которую следует иметь в виду, заключается в том, что библиотека TF-A поддерживает каждый набор таблиц перевода для данного режима перевода в качестве контекста.

  2. Ожидается, что несколько контекстов будут созданы программным обеспечением с использованием TF-A.

  3. Документация по этой теме доступна в документе xlat-tables-lib-v2-design.rst в папке amp-atf/docs выпуска TF-A.

  4. Папка amp-atf/lib/xlat_tables_v2 содержит код, демонстрирующий пример использования библиотечных функций, связанных с таблицей перевода.

  5. В TF-A определены две структуры для действий, связанных с таблицей перевода: xlat_ctx_t и mmap_region_t. На самом деле это определения типов, которые создают тип из struct xlat_ctx и struct mmap_region соответственно (определено в amp-atf/include/lib/xlat_tables/xlat_tables_v2_helpers.h). и amp-atf/include/lib/xlat_tables/xlat_tables_v2.h).

  6. struct xlat_ctx создается, чтобы содержать информацию для контекста перевода (т. е. любого режима перевода). Разумеется, ожидается, что каждый контекст будет содержать несколько сопоставлений областей MMU. struct mmap_region создается для хранения информации о каждом таком регионе.

  7. В библиотеке есть функции и макросы, которые абстрагируют создание, заполнение и использование этих структурных объектов. Поэтому нужно думать о вызове правильных функций из библиотеки в правильном порядке для работы с этими структурами.

  8. Один контекст перевода с именем tf уже создан и используется самой кодовой базой TF-A. Код в папке amp-atf/lib/xlat_tables_v2 работает с этим контекстом.

Дополнительные понятия –

  1. Статическое и динамическое отображение. Библиотека отделяет создание таблиц перевода в памяти от программирования основных регистров, чтобы они указывали на эти таблицы. Добавление областей MMU в память перед созданием таблиц перевода называется статическим сопоставлением. Кроме того, библиотека также поддерживает области MMU для добавления в память после создания таблиц перевода. Это называется динамическим сопоставлением.

  2. Существует две версии библиотеки таблиц xlat: xlat_tables и xlat_tables_v2. Версия 2 поддерживает динамическое отображение и является более гибкой. В целом обе версии в настоящее время все еще являются активными частями кодовой базы TF-A.

Процесс работы с программным обеспечением — (4 шага)

  1. Создать новый контекст перевода в памяти (новый объект struct xlat_ctx)

    - A macro REGISTER_XLAT_CONTEXT is defined for this
    - arguments - a name for the new context, max. number of mmap regions to be statically allocated for, max. number of xlat tables, virtual address range and physical address range. Usually, these would be defined in the platform-specific include files for the overall project. 
    - Lets assume that the name *name1* is passed to this macro. 
    - A *struct xlat_ctx" object with the name - *name1_xlat_ctx* will be created by this macro
    
  2. Добавьте необходимые регионы MMU в контекст (новые объекты struct mmap_region)

    - Create a *struct mmap_region* object out of the basic memory addresses and ranges
    - A macro MAP_REGION is defined for this
    - eg. *mmap_region_t tmp = MAP_REGION(base_pa_addr, base_va_addr, region_size, attributes)*
    - The attributes specify all the important qualities of the region like RO/RW, device/normal etc. There are macros for these values already available in TF-A (inside *amp-atf/include/lib/xlat_tables/xlat_tables_v2.h*). Multiple attributes can be ORed together and passed as the argument
    - After the region is created, it is to be added to the translation context through the *mmap_add_region_ctx* function
    - eg. mmap_add_region_ctx(&name1_xlat_ctx,&tmp);
    - Multiple calls to MAP_REGION and mmap_add_region_ctx would be required in general to map all the required regions.
    
  3. Убедитесь, что установлен режим перевода нового контекста

    - this is stored in the variable *xlat_regime* of the xlat_ctx_t object
    - there are macros already defined for all the regimes
    - eg. name1_xlat_ctx.xlat_regime = EL1_EL0_REGIME;
    
  4. Используйте приведенную выше информацию и создайте таблицы перевода в нужном формате в другой области памяти.

    - The function init_xlat_tables_ctx() is available for this
    eg. init_xlat_tables_ctx(&name1_xlat_ctx)
    
  5. Выполните аннулирование TLB и запрограммируйте базовые регистры (MAIR0/1, TTBR0/1_ELx, SCTLR_ELx и т. д.), чтобы они указывали на эти вновь созданные таблицы преобразования, и включите MMU.

    - There are different functions for each EL available in the library for this - 
    - *enable_mmu_el3(attributes), enable_mmu_el2(attributes), enable_mmu_el1(attributes)*
    - The attributes here refer to the attributes of the newly created translation table - where it is placed in memory and whether it is shareable across multiple PEs in a multicore system. 
    - eg. enable_mmu_el1(XLAT_TABLE_NSH);
    

Верно! С помощью вышеуказанных шагов должна быть возможность начать выполнение кода и выполнить данные в требуемом EL с включенным MMU.

Я надеюсь, что этот ответ даст некоторое преимущество людям, которые хотят использовать библиотеку TF-A для создания новых таблиц перевода для своих пользовательских целей. Пожалуйста, дайте мне знать, если есть какая-либо дополнительная информация, которую можно добавить к этому ответу, чтобы сделать его более полезным.

Спасибо!

person Ganesh Garga    schedule 25.08.2020
comment
Спасибо за информацию. Действительно полезно, но у меня есть вопрос. Где мне реализовать этот API? Могу ли я сделать это во время выполнения в контексте EL2? Или мне нужно сделать это через TF-A на этапах BL1, BL2, BL3-1 и т.д.? В моем случае я просто хочу разрешить EL2 иметь доступ к большому количеству регистров, не беспокоясь о безопасности. - person Farynx; 28.04.2021
comment
Я сделал это через TF-A, добавив в наш порт кода TF-A. Я думаю, что некоторые из использованных выше определений нужно будет изменить для режима EL2, но та же последовательность, выполняемая где-то на этапах загрузки TF-A, возможно, BL3-1, будет выполнять требуемую инициализацию для таблиц EL2. - person Ganesh Garga; 05.05.2021