Аргументы загрузчика передаются ядру Linux через регистры аргументов (MIPS 24KE c) - PullRequest
2 голосов
/ 01 апреля 2020

Я пытаюсь загрузить сжатое ядро ​​(vmlinuz) с пользовательским загрузчиком на коммутаторе, содержащем процессор MIPS 24KE c. Я не писал этот загрузчик, он присутствует в NOR fla sh на продукте, а исходный код был предоставлен поставщиком в его архиве GPL.

Загрузчик считывает заголовок из фиксированного местоположения в fla sh, содержащий:

  1. Магический заголовок c (SPIM)
  2. Адрес загрузки ядра
  3. Длина данных для загрузки
  4. Ядро адрес записи

Затем он копирует 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.

...