#assembly #linux-kernel #arm #uart
Вопрос:
Процедура распаковки Linux на ARM использует следующий код для вывода сообщений на консоль во время ранней загрузки:
static void icedcc_putc(int ch)
{
int status, i = 0x4000000;
do {
if (--i < 0)
return;
asm volatile ("mrc p14, 0, %0, c0, c0, 0" : "=r" (status));
} while (status amp; 2);
asm("mcr p14, 0, %0, c1, c0, 0" : : "r" (ch));
}
Из документации инструкции mcr кажется , что символ перемещается в какой-то регистр сопроцессора.
Пожалуйста, объясните, как персонаж в конечном итоге попадает в строки uart после последней команды подпрограммы icedcc_putc.
Комментарии:
1. Он записывается в регистр отладки сопроцессора, который перенаправляет его в определенный канал отладки (UART). Пожалуйста, прочтите документацию (upd: ссылка отредактирована): developer.arm.com/documentation/ddi0344/k/debug/…
2. Похоже, что он вращается-ждет статуса, а затем ставит в очередь персонажа, с UART, доступным в качестве сопроцессора.
3. Метод вывода зависит как от арки, так и от платы и требует инициализации UART программой загрузки. См. arch/arm/Kconfig.debug , а также CONFIG_DEBUG_UNCOMPRESS и CONFIG_DEBUG_LL