Загрузка ядра linux на цель через jtag
Я пытаюсь загрузить и загрузить ядро Linux через JTAG на оценочной плате AM3517. Мой отладчик - BDI3000. Я не использую openocd, так как согласно документации отладчика это не требуется. До сих пор я думаю, что могу загрузить образ vmlinux в память, но как только это будет выполнено, команда "cont" gdb не загружает linux. Я не получаю никаких сообщений на последовательной консоли.
Я следую инструкциям, приведенным в этой ссылке http://elinux.org/Debugging_The_Linux_Kernel_Using_Gdb
попытка получить адрес log_buffer, как упомянуто в ссылке, дает мне следующий вывод
(gdb) p (char*) &__log_buf[log_start]
$1 = 0xc04cd460 <Address 0xc04cd460 out of bounds>
Я много искал в интернете, но не смог найти правильный ответ. Не уверен, что я делаю не так.
1 ответ
Ядро Linux не может быть просто загружено и затем выполнено.
Прежде чем ядро Linux может быть выполнено, архитектура ARM требует, чтобы загрузчик:
- Настройте систему памяти.
- Загрузите образ ядра по правильному адресу памяти.
- При желании загрузите исходный RAM-диск по правильному адресу памяти.
- Инициализируйте параметры загрузки для передачи ядру (также называемую командной строкой ядра).
- Получить тип компьютера ARM Linux (и другую информацию для ATAG)
- Введите ядро с соответствующими значениями регистра.
Большинство из этих шагов являются общими для всех архитектур, но список системной информации ATAG уникален для ARM.
Все эти требования к загрузке упомянуты в "Загрузка ARM Linux".
Обычно загрузчик (например, U-Boot) выполняет эти задачи.
И учебник, который вы упомянули, говорит вам использовать загрузчик для инициализации вашей платы:
Наиболее практичный способ сделать это - установить аппаратную точку останова в начале ядра.
и перезагрузите вашу плату, используя сигнал сброса JTAG.
Ваш загрузчик инициализирует вашу доску и выполнение остановится при запуске ядра.
После этого вы можете загрузить ядро в память и запустить его.