Я пытаюсь загрузить сжатое ядро (vmlinuz) с пользовательским загрузчиком на коммутаторе, содержащем процессор MIPS 24KE c. Я не писал этот загрузчик, он присутствует в NOR fla sh на продукте, а исходный код был предоставлен поставщиком в его архиве GPL.
Загрузчик считывает заголовок из фиксированного местоположения в fla sh, содержащий:
- Магический заголовок c (SPIM)
- Адрес загрузки ядра
- Длина данных для загрузки
- Ядро адрес записи
Затем он копирует num_bytes после заголовка в адрес загрузки ядра и переходит на указанный адрес записи. Командная строка загрузки и initrd скомпилированы в образ ядра (через CONFIG_CMDLINE и CONFIG_INITRAMFS_SOURCE).
Несжатые образы ядра (vm linux) загружаются нормально. Когда я пытаюсь загрузить сжатое ядро, у меня нет выходных данных от декомпрессора или ядра.
Я заметил, что Linux ядро сохраняет регистры аргументов перед очисткой BSS и прыжком для декомпрессора (из архива / mips / boot / сжатого / head.S):
start:
/* Save boot rom start args */
move s0, a0
move s1, a1
move s2, a2
move s3, a3
Я новичок в сборке MIPS, но я знаю, что приведенные выше операторы перемещения сохраняют регистры аргументов в сохраненные регистры. Сохраненные регистры восстанавливаются после распаковки ядра, но до перехода к точке входа в ядро:
move a0, s0
move a1, s1
move a2, s2
move a3, s3
PTR_LI k0, KERNEL_ENTRY
Я посмотрел исходный код u-boot, и мне интересно, если этот вызов в boot_jump_ linux соответствует упомянутым выше «начальным аргументам загрузки»:
kernel(linux_argc, (ulong)linux_argv, (ulong)linux_env,
linux_extra);
Я не смог найти никакой документации ядра, объясняющей, какие аргументы ядро ожидает от загрузочного диска в регистрах. а0, а1, а2 и а3.