Que processo é usado sob as capas para carregar o kernel do Ubuntu Linux?

6

Quais etapas específicas ocorrem nos bastidores para carregar e iniciar o kernel do Ubuntu Linux?

    
por John S Gruber 14.05.2014 / 00:30

1 resposta

15

Inicializando o kernel do Ubuntu Linux A partir do disco para arquiteturas tradicionais i386 e amd64 Arquitetura sem EFI

Computadores de mesa e laptops modernos com o recurso EFI. Ao contrário dos tradicionais sistemas BIOS usados há mais de 20 anos, esses sistemas têm virtualmente um sistema operacional em seu firmware - capaz de carregar itens substanciais de software de uma só vez. Além disso, eles podem ser iniciados no computador com mais segurança diante de ataques de software que, de alguma forma, adquiriram a capacidade de armazenar software de inicialização.

O hardware mais tradicional tem menos firmware e começa pouco a pouco. Esses sistemas, descritos aqui, executam autotestes no firmware e iniciam o processo de inicialização.

Aqui está o código do firmware que inicializou o primeiro PC a partir do disquete (depois que o subsistema de disquete foi reinicializado):

   MOV AX,201H  
   SUB DX,DX  
   MOV ES,DX  
   MOV BS,OFFSET BOOT_LOCN  
   MOV CX,1  
   INT 13H  
   JNC H4  

O que se seguiu foi o tratamento de erros (4 tentativas), começando com reinicializações.

O H4 foi localizado um pouco mais cedo e foi:

   JMP BOOT_LOCN  

O BOOT_LOCN foi definido como o local 7C00H

[1] Manual de Referência Técnica do IBM PC (1984)

Não há muito para começar o seu sistema. O primeiro setor da mídia de armazenamento, o Master Boot Record, é lido na memória do computador no local 0: 7c00 e, em seguida, a execução pula para o início.

Diz-se que boot refere-se a escolher-se por seus bootstraps. Há uma sequência fina de eventos que devem ocorrer corretamente para iniciar seu sistema. Uma vez que código suficiente tenha sido carregado do disco e iniciado, o sistema pode fornecer informações como mensagens de erro, avisos e tratamento de erros. Um único setor não tem espaço suficiente para qualquer complexidade.

A propósito, eventualmente o código mudou um pouco. O byte de ordem alta do DX foi ajustado para 80H para se referir ao primeiro disco em vez do primeiro disquete. É claro que adições posteriores à BIOS de um PC incorporaram geometria dobrada e E / S baseada em pacotes para endereços de setores maiores e a capacidade de permitir a inicialização a partir de CDs, USB etc. A idéia sobre hardware tradicional de PC ainda é a mesma, leia o primeiro setor e controle de transferência.

Além disso, não aconteceu muito até a EFI.

Cabe a esse primeiro setor encontrar o que deve acontecer a seguir e carregar pelo menos seu primeiro setor, depois até esse setor para carregar vários setores - e seu sistema deve estar ativo e em execução. É assim que os sistemas Ubuntu modernos são inicializados em hardware quase moderno.

MBR

Fontes:
link

O primeiro setor é o MBR e o próximo setor é a primeira parte do Grub2. Devo acrescentar que as quatro partições primárias também são definidas no MBR e uma delas pode descrever uma região do disco que contém uma cadeia de partições estendidas. O primeiro endereço do setor é setor 0.

O que pode dar errado:
Se o Windows for instalado ou reinstalado após o Grub, ele poderá substituir o código Grub MBR por seu próprio. Com isso, o ponteiro para o código do Grub se foi e o novo código do Windows procurará uma partição com o sinalizador Boot, carregando um setor de seu início e transferindo o controle para ele.

Em uma instalação normal, o restante do núcleo do código do grub segue diretamente e o Grub MBR aponta para o próximo setor, o setor 1. Se você instalar o Grub em uma partição, o ponteiro poderá ser alterado. Esse ponteiro do grub está em 0x5c-0x60 do MBR e deve ser alterado correspondentemente.

00000050  f7 c1 01 00 74 03 fe 46  10 66 00 80 01 00 00 00  |....t..F.f......|
                                               ^

O maior número de setor que o ponteiro de 4 bytes conterá é de 2 ^ 32, 2.294.967.296 setores, ou menor que 2,2 x 10 12 bytes. O seguinte código do grub deve estar dentro dessa parte do disco.

Grub2 core.img Iniciar

Fontes:
link

Geralmente começando no setor 1 (se você instalou o Grub2 para / dev / sda, por exemplo) são as partes do core.img. A imagem inteira deve ser carregada para o grub para fornecer um prompt. No final do primeiro setor, há uma lista de bloqueio, uma lista de setores e contagens a partir das quais o restante da imagem deve ser carregado. Ao contrário do MBR, há espaço suficiente no setor para carregar vários conjuntos de múltiplos setores. Agora estamos chegando a algum lugar. Os setores são posicionados a cada 0x200 bytes. Cada extensão é descrita em 16 bytes.

         |
00000360  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000370  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000380  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000390  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000003a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000003b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000003c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000003d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000003e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000003f0  00 00 00 00 02 00 00 00  00 00 00 00 63 00 20 08  |............c. .|

O que pode dar errado:
Unidades com formato GPT têm os descritores de partição localizados no segundo setor. Nesse caso, a imagem do grub deve estar localizada em algum outro lugar em uma partição. Provavelmente seria melhor formatar uma pequena partição apenas para que o grub mantenha sua imagem central. Coloque-o em algum lugar perto do começo do disco, onde você não será tentado a movê-lo ou perturbá-lo. Não deve ser movido sem reinstalar o grub.

por John S Gruber 14.05.2014 / 01:05

Tags