mensagens do bootloader e bootm.c

2

Quando eu inicializo o linux no zynq board, uma das linhas que obtenho é:

Starting kernel . . .

Para fins de depuração, eu queria saber onde no código-fonte essas linhas são escritas, eu as alteraria e adicionaria as instruções printf / printk em vários pontos para depurar meu kernel do Linux. Descobri que no arquivo bootm.c foi realmente escrito. Mas eu também encontrei este material 'falso' aqui que eu sou capaz de entender.

/**
 * announce_and_cleanup() - Print message and prepare for kernel boot
 *
 * @fake: non-zero to do everything except actually boot
 */
static void announce_and_cleanup(int fake)
{
        printf("\n Starting kernel ...%s\n\n", fake ?
                "(fake run for tracing)" : "");
        bootstage_mark_name(BOOTSTAGE_ID_BOOTM_HANDOFF, "start_kernel");
#ifdef CONFIG_BOOTSTAGE_FDT
           if (flag == BOOTM_STATE_OS_FAKE_GO)
                bootstage_fdt_add_report();
#endif
#ifdef CONFIG_BOOTSTAGE_REPORT
        bootstage_report();
#endif

o arquivo completo está disponível aqui também

O que exatamente é esse 'falso' stuf e por que precisamos dele?

    
por gpuguy 11.03.2014 / 11:24

1 resposta

0

A rotina announce_and_cleanup não usa seu parâmetro fake , exceto para imprimir a "(execução falsa para rastreio)" ou não. Em particular, ele não é passado para as funções que chama depois de printf() . O comentário de parâmetro para fake diz que não-zero significa fazer tudo, exceto inicializar, e a diferença em printf() não pode ser a causa disso.

Se você olhar para onde announce_and_cleanup() está sendo chamado, então fake pode ser um pouco mais claro (do mesmo arquivo que você vincula):

 248/* Subcommand: GO */
 249static void boot_jump_linux(bootm_headers_t *images, int flag)
 250{
 251#ifdef CONFIG_ARM64
 252        void (*kernel_entry)(void *fdt_addr);
 253        int fake = (flag & BOOTM_STATE_OS_FAKE_GO);
 254
 255        kernel_entry = (void (*)(void *fdt_addr))images->ep;
 256
 257        debug("## Transferring control to Linux (at address %lx)...\n",
 258                (ulong) kernel_entry);
 259        bootstage_mark(BOOTSTAGE_ID_RUN_OS);
 260
 261        announce_and_cleanup(fake);
 262
 263        if (!fake)
 264                kernel_entry(images->ft_addr);
 265#else
 266        unsigned long machid = gd->bd->bi_arch_number;
 267        char *s;
 268        void (*kernel_entry)(int zero, int arch, uint params);
 269        unsigned long r2;
 270        int fake = (flag & BOOTM_STATE_OS_FAKE_GO);
 271
 272        kernel_entry = (void (*)(int, int, uint))images->ep;
 273
 274        s = getenv("machid");
 275        if (s) {
 276                strict_strtoul(s, 16, &machid);
 277                printf("Using machid 0x%lx from environment\n", machid);
 278        }
 279
 280        debug("## Transferring control to Linux (at address %08lx)" \
 281                "...\n", (ulong) kernel_entry);
 282        bootstage_mark(BOOTSTAGE_ID_RUN_OS);
 283        announce_and_cleanup(fake);
 284
 285        if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len)
 286                r2 = (unsigned long)images->ft_addr;
 287        else
 288                r2 = gd->bd->bi_boot_params;
 289
 290        if (!fake)
 291                kernel_entry(0, machid, r2);
 292#endif
 293}

se o falso for diferente de zero para announce_and_cleanup() , o kernel_entry() nunca será chamado e o fluxo de controle do programa não será transferido para o kernel carregado.

    
por 12.03.2014 / 23:05