startup_64
pode ser inserido por
/* The entry point for the PE/COFF executable is efi_pe_entry. */
ENTRY(efi_pe_entry)
...
movl BP_code32_start(%esi), %eax
leaq startup_64(%rax), %rax
jmp *%rax
ENDPROC(efi_pe_entry)
Como alternativa, acredito que handover_entry
dentro da rotina efi_pe_entry
pode ser saltada diretamente para um bootloader EFI que reconhece o Linux. Essa abordagem híbrida permite que os gerenciadores de inicialização continuem fornecendo determinados recursos específicos do Linux, enquanto ao mesmo tempo permite que o kernel use recursos específicos da EFI. Veja O processo de bootstrap em sistemas EFI (LWN.net) .
Finalmente, startup_64
pode ser saltado para startup_32
; isso acontece quando o kernel é carregado por um carregador de inicialização do BIOS que reconhece o Linux.
(Ok, há mais um caso. Um kernel de 64 bits pode ter um efi32_stub_entry
que então salta para startup_32
. Eu estou ignorando isso. Kernels de 64 bits na EFI de 32 bits ainda estão marcados como experimental de qualquer maneira).
Com base no acima, não tenho certeza se startup_64
é ever a primeira instrução a ser executada em vmlinux
. O comentário diz que poderia ser inserido "diretamente de um gerenciador de inicialização de 64 bits", mas eu não sei de nada disso.
No caso do BIOS, você pode ver claramente que startup_32
é responsável por configurar uma tabela de páginas inicial de 64 bits ("early paginável de inicialização 4G") e, é claro, mudar para o modo de 64 bits, também conhecido como "modo longo". ".
No caso do EFI64, a CPU já está no modo de 64 bits. efi_pe_entry
chamadas make_boot_params()
e efi_main()
em eboot.c
. ( handover_entry
apenas chama efi_main()
, como neste caso o gerenciador de inicialização fornece struct boot_params
). eboot.c
não configura tabelas de páginas. Portanto, o comentário está assumindo que o EFI configurou pelo menos um mapeamento de identidade para todas as páginas do kernel que ele carregou (incluindo qualquer bss espaço), o que faz sentido para mim: -).