quem carregou uma tabela de páginas de identidade mapeada?

1

Eu quero entender as etapas de inicialização do Linux x86_64, depois de ler alguns artigos e linux-3.14.65/Documentation/x86/boot.txt , e quase sei que a primeira instrução a ser executada em vmlinux é startup_x86 , mas quando leio os comentários em arch/x86/kernel/head_64.S sobre startup_64 :

    .text
__HEAD
.code64
.globl startup_64
startup_64:
/*
 * At this point the CPU runs in 64bit mode CS.L = 1 CS.D = 0,
 * and someone has loaded an identity mapped page table
 * for us.  These identity mapped page tables map all of the
 * kernel pages and possibly all of memory.

Ainda estou confuso com o comentário, não sei quem criou CPU runs in 64bit mode e quem has loaded an identity mapped page table for us ? É Grub ? O que eu sinto falta?

    
por abelard2008 09.04.2016 / 15:20

2 respostas

1

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: -).

link

    
por 29.01.2019 / 01:25
0

De acordo com o primeiro marcador na seção "Inicializando a tabela de páginas" do link , o entry.S é responsável pela configuração das tabelas de páginas. E, de fato, encontramos lógica no link que lida com isso (" As tabelas de páginas são configuradas de tal forma que ... ").

No link , no entanto, encontramos mais referências para configurar tabelas de páginas. Aqui vemos "Build early 4G boot pagetable" e "Enable the boot page tables."

Este artigo fornece exemplos de como ativar a paginação, incluindo a paginação de identidade: link . Observe que o exemplo usa os registros de controle cr3, cr4 e cr0, conforme descrito no link . Os arquivos entry_64.S e head_64.S também usam esses registros de controle.

    
por 03.04.2018 / 13:58