Отладка раннего кода запуска ядра в QEMU - PullRequest
5 голосов
/ 17 апреля 2019

У меня есть некоторый код (смесь ассемблера и C), скомпилированный в двоичный файл ELF, который загружается некоторым кодом прошивки / загрузчика в QEMU по определенному физическому адресу. ELF связан с использованием виртуальных адресов; однако код предназначен для запуска с выключенным MMU, что означает, что он должен быть независимым от позиции.

Проблема в том, что для ПК задан физический адрес точки входа, что имеет смысл, но поскольку все символы ссылаются с помощью виртуальных адресов, GDB не знает, где находится точка входа.

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

Мне удалось отладить этот код, связав его по физическим адресам, но очевидно, что это создаст проблемы, как только я включу MMU.

Кто-нибудь знает, что мне здесь не хватает?

1 Ответ

1 голос
/ 18 апреля 2019

Не думаю, что ваша проблема связана с QEMU (или даже с ARM).Я считаю, что есть как минимум три способа справиться с этим:

  1. Просто используйте ассемблер
  2. Используйте symbol-file
  3. Наложения

Ассемблер

У меня была эта проблема, но я просто переключился бы на изучение ассемблера.Это довольно легко, особенно если вы objdump -S версия адреса MMU / нормальный, чтобы соответствовать ассемблеру.Вы можете направить вывод objdump в файл и удалить не перемещенный код, если хотите.Тем не менее, большинство редакторов смогут обрабатывать большой файл.

Просмотр ассемблера может быть очень полезным, так как часто некоторая константа перемещения или ссылка на тип не PIC не верны.Вам нужно, чтобы код / ​​данные были правильными, и ваш код PIC может вызывать некоторую процедуру библиотеки gcc, связанную с тем местом, которое вы не учли.Так что, хотя это примитивно, у него есть некоторые преимущества.

Файл символов

Другой способ - использовать то, что у вас есть с symbol-file.Используйте физическую ссылку с symbol-file во время загрузки, а затем symbol-file MMU / обычной ссылки после переключения MMU.Очевидно, загрузить версию MMU.

Наложения

Я думаю, вы могли бы справиться с этим с помощью оверлеев , хотя на самом деле вы делаете обратное.VMA - это адрес MMU, а LMA - физический адрес загрузки.Сначала отметьте его как сопоставленный, а затем вы можете обновить с помощью _ovly_debug_event() при включении MMU.

Оверлеи принимают код, но это наиболее удобно.Я бы попытался сделать это, если у вас уже есть отладочные цели сборки в вашей системе разработки программного обеспечения и вы условно кодировали этот код.Однако, если вы используете фактические оверлеи в ld, это может решить некоторые ваши проблемы, и вы можете найти это наиболее надежным.Влияние ресурсов наложения довольно минимально, но оно существует.


Ссылка

Ссылки относятся к проблеме кодирования относительно того, почемуВы можете отладить это.

...