Cortex A9 загрузки и памяти - PullRequest
7 голосов
/ 16 июля 2011

Я новичок в программировании микроконтроллеров.Интересная фишка здесь - cortex-a9.При сбросе или включении должен быть код 0x0000000 из моих показаний.Мои вопросы, хотя они могут показаться слишком тривиальными, помогут мне представить некоторые концепции в перспективе.

Адрес памяти 0x0000000 находится в ПЗУ?Что происходит сразу после чтения кода с этого адреса?Должен ли присутствовать какой-либо загрузчик, и если да, то по какому адресу он должен быть и должен ли он также находиться в ПЗУ?Наконец, в какой момент запускается ядро ​​и где находится код ядра?

Ответы [ 2 ]

9 голосов
/ 17 июля 2011

ARM продает ядра, а не чипы, то, что находится по этому адресу, зависит от производителя чипа, который купил ядро ​​ARM и поместил его в свой чип.Реализации варьируются от поставщика к поставщику, от чипа к чипу.

Традиционно ARM будет загружаться с нуля адреса, точнее, вектор исключения сброса находится по адресу нуля.В отличие от других семейств процессоров, традиционная модель ARM - это НЕ список адресов для точек входа исключений, а ARM ВЫПОЛНЯЕТ инструкцию по этому адресу, что означает, что вам нужно использовать либо относительную ветвь, либо инструкцию загрузки ПК.Более новые серии cortex-m, которые являются только thumb / thumb2 (они не могут выполнять инструкции ARM (32-битные)), используют традиционный (не ARM) список адресов, также нулевой адрес не является вектором исключения, этоадрес для загрузки в стек указателя, затем вторая запись сбрасывается и так далее.Кроме того, список исключений cortex-m отличается тем, что в этом семействе около 128 отдельных прерываний, в то время как в традиционном ARM их два, быстрое и нормальное.Существует недавний вопрос на основе cortex-m или, возможно, сформулированный как вопрос thumb2 для запуска linux на ARM thumb2.Я думаю, что все реализации cortex-m представляют собой микросхемы класса микроконтроллеров и имеют только объем памяти микросхем в десятки килобайт, в основном они не попадают в категорию, о которой вы спрашиваете.И вы все равно спрашиваете о cortex-a9.

У ряда ядер или, возможно, у всех них есть вариант загрузки, где адрес загрузки может быть 0x00000000 или что-то вроде 0xFFFF0000 в качестве альтернативного адреса.использование этого было бы очень запутанным для пользователей ARM, но оно предоставляет возможность, например, иметь rom по одному адресу и ram по другому, позволяя вам загружаться при включении питания из rom, а затем переключать таблицу исключений в ram для работы во время выполнения.Вероятно, у вас есть микросхема с ядром, которая может это делать, но поставщик микросхем должен решать, использовать эти грани основных функций или нет, или использовать их в некоторых настройках и не предоставлять вам такую ​​гибкость.

Вам нужно взглянуть на таблицу / документацию для данного чипа.Узнайте, как называется ядро ​​ARM, как вы упомянули cortex-a9.В идеале вы хотите узнать об rev тоже как о r0p0, а затем зайти на сайт ARM и найти TRM, техническое руководство для этого ядра.Вы также захотите получить копию ARM ARM, ARM Architectural Reference Manual.(Традиционные) векторы исключения ARM описаны в ARM ARM, а также довольно много дополнительной информации.Вам также нужна документация для поставщиков микросхем и посмотрите их схему загрузки.Некоторые при включении указывают нулевой адрес на загрузочный выпуск, тогда загрузчик должен будет что-то сделать, немного перевернуть регистр, и контроллер памяти переключит адрес 0 на ram.Некоторые могут иметь адрес 0, всегда настроенный как ram, а другой адрес всегда настроенный как rom, скажем, например, 0x80000000, и чип загрузит некоторые элементы из ROM в RAM перед загрузкой, или чип может просто получить питаниеустановив для вектора сброса ветвь rom, затем загрузчик загрузит таблицу векторов.Как много разных схем вы можете придумать, вероятно, кто-то попробовал это, поэтому вам нужно изучить документацию производителя микросхем или пример кода, чтобы понять, в основном ответ на ваш вопрос, зависит ли это, и вы должны проверить сПроизводитель чипа.

ARM TRM для ядра должен описывать, если таковые имеются, варианты ремешка на ядре (например, возможность загрузки с альтернативного адреса), подключать те опции ремешка, если таковые имеются, которые реализованыпо поставщику.ARM ARM на самом деле не собирается вдаваться в это, как TRM.Однако у поставщика, у которого стоит покупать, будет собственная документация и / или код, показывающий стратегию загрузки на основе rom.

Для системы, предназначенной быть системой linux, у вас будет загрузчик, некоторый код не-linux (очень похожий на bios на вашем настольном компьютере / ноутбуке), который запускает систему и в конечном итоге запускает linux.Linux потребуется достаточное количество памяти (по сравнению с микроконтроллером и другими хорошо известными реализациями ARM), этот ram может в конечном итоге быть sram или dram, и загрузчику может потребоваться инициализировать интерфейс памяти, прежде чем он сможет запустить linux.Существуют популярные загрузчики, такие как redboot и uboot.и то, и другое значительно излишним, но предоставляют разработчикам и пользователям такие функции, как возможность перепрошивки Linux и т. д.

В ARM linux есть ATAG (ARM TAG).Вы можете использовать как традиционную командную строку linux, чтобы сообщить информацию о загрузке linux, например, какой адрес для поиска корневой файловой системы, так и ATAG.Atags - это структуры в памяти, которые, я думаю, установлены как r0 или что-то подобное, когда вы переходите от загрузчика к linux.Общая концепция заключается в том, что чип включается, загружается с rom или ram, если готовит ram к тому, чтобы он был готов к использованию, linux может захотеть / нужно скопировать с rom на ram, корневая файловая система, если она отдельная, может захотетьбыть скопированным в другое место в оперативной памяти.ATAG готовы сообщить arm, где при необходимости распаковать linux, а также где найти командную строку и или где найти такие вещи, как корневая файловая система, некоторые регистры подготавливаются как передаваемые параметры в linux и, наконец, ветвь загрузчика переходит кадрес, содержащий точку входа в ядре Linux.

6 голосов
/ 16 июля 2011

У вас должен быть доступный загрузочный код по адресу, с которого начинает выполняться оборудование.

Обычно это достигается путем привязки аппаратного оборудования к флэш-памяти или загрузочному ПЗУ с загрузочным адресом и запуска оттуда.

Обратите внимание, что в микроконтроллерах код, который запускается при загрузке, имеет довольно трудную жизнь - еще не инициализировано какое-либо оборудование, и я не имею в виду, что даже контроллеры DDR, контролирующие доступ к ОЗУ, еще не работают поэтому ваш код должен работать без оперативной памяти.

После того, как начальный загрузочный код устанавливает достаточное количество аппаратного обеспечения (например, устанавливает микросхемы ОЗУ, настраивает TLB и т. Д., Программные MAC-адреса и т. Д.), У вас запускается загрузчик.

В некоторых системах начальный загрузочный код - это только первая часть загрузчика. В некоторых системах специальный загрузочный код настраивает, а затем считывает загрузчик из флэш-памяти и запускает его.

Задача загрузчика состоит в том, чтобы перенести образ ядра / ОС в ОЗУ, обычно из флэш-памяти или сети (но также может быть разделена памятью с другой платой, шинами PCI и т. П., Хотя это встречается реже). Если у загрузчика есть образ двоичного файла ядра / ОС в ОЗУ, он может при необходимости распаковать его и передать управление (вызов) начальному адресу образа ядра / ОС.

Иногда образ ядра / ОС на самом деле представляет собой небольшой декомпрессор и каплю сжатого ядра.

В любом случае конечный результат заключается в том, что ядро ​​/ ОС доступно в ОЗУ, и загрузчик, опционально через копилку, передал ему управление.

Затем запускается ядро ​​/ ОС и ОС запускается.

...