Начал писать ARM RTOS и запутался в отображении памяти

Итак, я написал небольшую RTOS раньше для школы, однако мы просто использовали карту памяти, которую нам оставил загрузчик (redboot). У него (TS-7200) было 4 сегмента оперативной памяти по 8 МБ, но загрузчик «переназначил» их так, чтобы они были непрерывными, начиная с 0. Мне в основном интересно, какие механизмы сделали это возможным, так как сейчас я пытаюсь написать более легкая прошивка для автопилота на основе px4fmu, и я хотел бы знать, что происходит с моей памятью, чтобы я мог выяснить свой скрипт компоновщика, а также защиту памяти.

Включил ли загрузчик MMU и настроил ли таблицу страниц так, чтобы адреса 0–32 МБ транслировались в правильные физические адреса? Если это так, я думал, что перевод не происходит автоматически в режиме супервизора, в котором вас оставляет загрузчик.

Я подозреваю, что это не так, и что загрузчик сделал какое-то заклинание GPMC, чтобы изменить адресацию микросхем памяти. Я что-то читал о том, что периферийные устройства нельзя переназначить, что имело бы смысл с этой теорией. Если это так, может ли кто-нибудь дать мне краткий обзор того, как это работает / где какие адреса в конечном итоге означают что? Раньше я видел в руководствах пользователя SoC информацию об «адресах шины», как они соотносятся / переводятся в адреса в различных типах памяти?


person mthiffau    schedule 15.10.2013    source источник


Ответы (1)


Итак, есть процессор, затем MMU, затем кэш l1, затем край «процессорного ядра», хотя то, что похоронено под ранними системами памяти, также является ядром, но глубже.

Когда «процессор» обращается к какому-то адресу, которым непосредственно манипулирует программист (значение, которое у вас есть в регистре, используемом для хранения адреса для загрузки или сохранения, плюс любые смещения, которые вы кодируете).

Если mmu включен, то mmu берет некоторые биты из адреса, выполняет некоторые математические операции на основе адресного регистра и того, как сконфигурирован mmu, а затем генерирует свой собственный цикл памяти на стороне памяти mmu (есть сторона процессора и сторону памяти). Который ищет запрограммированную пользователем информацию таблицы mmu, как происходят такие вещи, как изменение виртуального адреса на физический. После того, как MMU выполнит количество циклов памяти, необходимое для сбора данных (обратите внимание, что MMU может иметь небольшой кеш предыдущих поисков, чтобы сэкономить фактические циклы памяти), затем, пока нет ошибки (адрес, к которому осуществляется доступ описан в таблицах, и разрешения совпадают, так что вам разрешен доступ к этой памяти, и/или поиск в таблице mmu сам по себе не вызвал ошибку) доступ, который процессор хотел сделать, выполняется с использованием физического адреса.

если mmu отключен, то доступ процессора идет прямо в кэш l1, а затем в систему памяти через шину axi или amba. Кэш l2 живет на amba/axi, если есть l2.

Как только вы доберетесь до amba/axi, вы попадете в логику поставщика, независимо от того, кто сделал чип (рука не производит чипы, она производит процессорные ядра, некоторые поставщики оборачивают это ядро ​​своей собственной логикой, а затем производят чипы и продают чипы). Вы попадаете в систему памяти поставщиков, которая может быть как очень простой, так и очень сложной. Например, у вас могут быть настраиваемые параметры, так что некоторое адресное пространство, такое как ноль, может в какой-то момент (например, при включении) указывать на ПЗУ, а затем, если вы измените настройку, доступ к нулю или около нуля приведет к тому, что он перейдет к какой-то оперативной памяти . У вас может быть некоторая логика, которая манипулирует всем адресным пространством, скажем, два старших бита адреса, например, входят в некоторую логику, которая имеет четыре набора регистров управления, и для каждой из четвертей адресного пространства эти регистры управления могут делать что-то для адрес или другие вещи, мало чем отличающиеся от мму.

В конце концов логика поставщика начнет декодировать больше адресных битов и определять, пытаетесь ли вы добраться до фактического ОЗУ, ПЗУ или периферийных устройств, а затем, когда он приближается к конечной цели, csr внутри периферийного устройства и т. д. биты адреса дальше расшифровывается. Адресное пространство любого процессора может (не всегда), но может быть похоже на дерево, ствол — это место, где адрес выходит из процессора, но когда адрес анализируется, он может разветвляться в разных направлениях, в конце концов он находит отдельный лист, который вы пытались адрес, будь то ячейка памяти в оперативной памяти, csr в каком-либо периферийном устройстве или какой-либо оперативной памяти или другом элементе в периферийном устройстве (что может вызвать другую цепочку событий на какой-либо другой шине, например, usb или pcie).

Итак, сказав все это, краткий ответ здесь: во-первых, вы должны работать без MMU и кешей, понять «физическое» адресное пространство чипа (со стороны поставщика), которое вам нужно будет понять с или без ммм. это адресное пространство очень специфично для этого поставщика и, возможно, для этого чипа или семейства чипов, поэтому вам понадобится документация поставщиков чипов. Затем позже узнайте, как использовать mmu, я бы сначала рекомендовал попробовать его с виртуальными адресами, такими же, как физические, научиться помечать оперативную память как кешируемую, а периферийное адресное пространство как некэшируемое (затем включите кеш данных и посмотрите, если это сработало). затем научитесь добавлять блоки виртуального адресного пространства, которые указывают на разные физические адреса, после чего вы готовы начать использовать mmu для операционной системы.

Процессор руки сам не знает периферии от барана от рома от дыры в стене. Биты адреса - это просто биты, некоторые шаблоны, которые обычно не заботятся, за некоторыми исключениями для некоторых архитектур процессоров рук, где есть некоторые периферийные устройства внутри самой руки, которые она декодирует и не позволяет вам использовать их дальше по линии, но поставщики периферийных устройств, оперативной памяти, ПЗУ и т. д., о которых рука не знает или не заботится, поэтому эти адресные пространства могут иметь свои виртуальные адреса, отличные от физических. Чего вы не хотите делать, так это кэшировать адресные пространства (данные) периферийных устройств. Некоторые более новые ядра рук имеют некоторые правила предсказания ветвлений и ограничения, для которых вы можете получить некоторую выборку, поэтому, если у вас есть такая тонко настроенная гибкость в вашей настройке и у вас есть периферийные устройства, которые выполняют некоторые изменения (очистка при чтении, автоматическое увеличение адреса в пределах периферийное устройство и т. д.), которые в любом случае являются плохим выбором дизайна в современных системах, вы хотели бы избежать возможного создания ситуации, когда выборка инструкции предсказания ветвления может вызвать чтение в одно из этих мест.

Другая проблема, с которой вы можете столкнуться, с которой Redboot может исправить или не исправить для вас, - это dram или даже sram, если на то пошло, но если RAM находится вне процессора и требует обучения или настройки, и это обучение или настройка были выполнены для вас, купите redboot или загрузчик до redboot, тогда вам действительно нужно просто позволить redboot сделать это, а затем загрузить redboot и запустить RTOS. инициализация физической памяти может быть (не всегда) учебным опытом наравне с написанием собственных RTO с нуля, поэтому в ряде этих систем с поддержкой Linux вам нужно решить, сколько вещей вы хотите заново изобрести и почему. У вас будет достаточно работы, чтобы заставить что-то работать без MMU и пространства памяти на основе плоского физического адреса, стройте один мост за раз, не пытайтесь построить их все сразу, подождите, пока вы не доберетесь до следующего препятствия, прежде чем пытаться решить Это.

person old_timer    schedule 16.10.2013
comment
большая часть из них носит общий характер и не обязательно относится к руке. другие поставщики процессоров часто производят свои собственные чипы, поэтому вам не нужно иметь дело с документацией отдельных поставщиков. но основы виртуальной и физической стороны mmus, а также контроллер памяти и то, как этот бэкэнд декодирует и маршрутизирует транзакции, довольно схожи, если вы посмотрите за нюансы шины памяти каждого процессора. - person old_timer; 16.10.2013