The translation is temporarily closed for contributions due to maintenance, please come back later.
Context English Portuguese (Brazil) State
The FreeBSD boot process can be surprisingly complex. After control is passed from the <acronym>BIOS</acronym>, a considerable amount of low-level configuration must be done before the kernel can be loaded and executed. This setup must be done in a simple and flexible manner, allowing the user a great deal of customization possibilities. O processo de inicialização do FreeBSD pode ser surpreendentemente complexo. Após o controle ser passado da <acronym>BIOS</acronym>, uma quantidade considerável de configuração de baixo nével deve ser feita antes que o kernel possa ser carregado e executado. Essa configuração deve ser feita de maneira simples e flexível, permitindo ao usuário uma grande quantidade de possibilidades de personalização.
The boot process is an extremely machine-dependent activity. Not only must code be written for every computer architecture, but there may also be multiple types of booting on the same architecture. For example, a directory listing of <filename>/usr/src/sys/boot</filename> reveals a great amount of architecture-dependent code. There is a directory for each of the various supported architectures. In the x86-specific <filename>i386</filename> directory, there are subdirectories for different boot standards like <filename>mbr</filename> (Master Boot Record), <filename>gpt</filename> (<acronym>GUID</acronym> Partition Table), and <filename>efi</filename> (Extensible Firmware Interface). Each boot standard has its own conventions and data structures. The example that follows shows booting an x86 computer from an <acronym>MBR</acronym> hard drive with the FreeBSD <filename>boot0</filename> multi-boot loader stored in the very first sector. That boot code starts the FreeBSD three-stage boot process. O processo de inicialização é uma atividade extremamente dependente da máquina. Não sé deve ser escrito código para cada arquitetura de computador, mas também pode haver vários tipos de inicialização na mesma arquitetura. Por exemplo, uma lista de diretórios de <filename>/usr/src/sys/boot</filename> revela uma grande quantidade de código dependente de arquitetura. Existe um diretório para cada uma das várias arquiteturas suportadas. No x86-specific <filename>i386</filename> diretório, existem subdiretórios para diferentes padrões de inicialização, como <filename>mbr</filename> (Master Boot Record), <filename>gpt</filename> (Tabela de Partição <acronym>GUID</acronym> ) e <filename>efi</filename> (Interface de Firmware Extensível). Cada padrão de inicialização possui suas próprias convenções e estruturas de dados. O exemplo a seguir mostra a inicialização de um computador x86 de um disco rígido <acronym>MBR</acronym> com o FreeBSD <filename>boot0</filename> carregador multi-boot armazenado no primeiro setor. Esse código inicia o processo de inicialização de três estágios do FreeBSD.
The key to understanding this process is that it is a series of stages of increasing complexity. These stages are <filename>boot1</filename>, <filename>boot2</filename>, and <filename>loader</filename> (see <citerefentry><refentrytitle>boot</refentrytitle><manvolnum>8</manvolnum></citerefentry> for more detail). The boot system executes each stage in sequence. The last stage, <filename>loader</filename>, is responsible for loading the FreeBSD kernel. Each stage is examined in the following sections. A chave para entender esse processo é que ele é uma série de estágios de crescente complexidade. Esses estágios são <filename>boot1</filename> , <filename>boot2</filename> e <filename>carregador</filename> (Vejo <citerefentry><refentrytitle>boot</refentrytitle><manvolnum>8</manvolnum></citerefentry> para mais detalhes). O sistema de inicialização executa cada estágio em sequência. O último estágio <filename>carregador</filename> , é responsável por carregar o kernel do FreeBSD. Cada estágio é examinado nas seções seguintes.
When the computer powers on, the processor's registers are set to some predefined values. One of the registers is the <emphasis>instruction pointer</emphasis> register, and its value after a power on is well defined: it is a 32-bit value of <literal>0xfffffff0</literal>. The instruction pointer register (also known as the Program Counter) points to code to be executed by the processor. Another important register is the <literal>cr0</literal> 32-bit control register, and its value just after a reboot is <literal>0</literal>. One of <literal>cr0</literal>'s bits, the PE (Protection Enabled) bit, indicates whether the processor is running in 32-bit protected mode or 16-bit real mode. Since this bit is cleared at boot time, the processor boots in 16-bit real mode. Real mode means, among other things, that linear and physical addresses are identical. The reason for the processor not to start immediately in 32-bit protected mode is backwards compatibility. In particular, the boot process relies on the services provided by the <acronym>BIOS</acronym>, and the <acronym>BIOS</acronym> itself works in legacy, 16-bit code. Quando o computador liga, os registros do processador são ajustados para alguns valores pré-definidos. Um dos registradores é o <emphasis>ponteiro de instrução</emphasis> registrar, e seu valor após um power on é bem definido: é um valor de 32 bits de <literal>0xfffffff0</literal> . O registrador de ponteiro de instrução (também conhecido como Contador de Programa) aponta para o código a ser executado pelo processador. Outro registro importante é o <literal>cr0</literal> Registro de controle de 32 bits, e seu valor logo após a reinicialização é <literal>0</literal>. Um de <literal>cr0</literal>'s bits, o bit PE (Protection Enabled), indica se o processador está sendo executado no modo protegido de 32 bits ou no modo real de 16 bits. Como esse bit é limpo no momento da inicialização, o processador é inicializado no modo real de 16 bits. O modo real significa, entre outras coisas, que os endereços linear e físico são idênticos. O motivo para o processador não iniciar imediatamente no modo protegido de 32 bits é compatível com versões anteriores. Em particular, o processo de inicialização depende dos serviços fornecidos pelo <acronym>BIOS</acronym>, e o próprio <acronym>BIOS</acronym> funciona em código legado de 16 bits.
The value of <literal>0xfffffff0</literal> is slightly less than 4 GB, so unless the machine has 4 GB of physical memory, it cannot point to a valid memory address. The computer's hardware translates this address so that it points to a <acronym>BIOS</acronym> memory block. O valor de <literal>0xfffffff0</literal> é um pouco menor que 4 GB, portanto, a menos que a máquina tenha 4 GB de memória física, ela não pode apontar para um endereço de memória válido. O hardware do computador traduz esse endereço para que ele aponte para um bloco de memória da <acronym>BIOS</acronym> .
The <acronym>BIOS</acronym> (Basic Input Output System) is a chip on the motherboard that has a relatively small amount of read-only memory (<acronym>ROM</acronym>). This memory contains various low-level routines that are specific to the hardware supplied with the motherboard. The processor will first jump to the address 0xfffffff0, which really resides in the <acronym>BIOS</acronym>'s memory. Usually this address contains a jump instruction to the <acronym>BIOS</acronym>'s POST routines. O <acronym>BIOS</acronym> (Basic Input Output System) é um chip da placa-mãe que tem uma quantidade relativamente pequena de memória somente leitura (<acronym>ROM</acronym>). Essa memória contém várias rotinas de baixo nível que são específicas para o hardware fornecido com a placa-mãe. O processador irá primeiro saltar para o endereço 0xfffffff0, que realmente reside na memória do <acronym>BIOS</acronym>. Normalmente, este endereço contém uma instrução de salto para as rotinas de POST do <acronym>BIOS</acronym>.
The <acronym>POST</acronym> (Power On Self Test) is a set of routines including the memory check, system bus check, and other low-level initialization so the <acronym>CPU</acronym> can set up the computer properly. The important step of this stage is determining the boot device. Modern <acronym>BIOS</acronym> implementations permit the selection of a boot device, allowing booting from a floppy, <acronym>CD-ROM</acronym>, hard disk, or other devices. O <acronym>POST</acronym> (Power On Self Test) é um conjunto de rotinas incluindo a verificação de memória, verificação do barramento do sistema e outras inicializações de baixo nível para que a <acronym>CPU</acronym> possa configurar o computador corretamente. A etapa importante deste estágio é determinar o dispositivo de inicialização. As implementações modernas do <acronym>BIOS</acronym> permitem a seleção de um dispositivo de inicialização, permitindo a inicialização a partir de um disquete, <acronym>CD-ROM</acronym>, disco rígido ou outros dispositivos.
This sector is our boot-sequence starting point. As we will see, this sector contains a copy of our <filename>boot0</filename> program. A jump is made by the <acronym>BIOS</acronym> to address <literal>0x7c00</literal> so it starts executing. Este setor é o nosso ponto de partida da sequência de inicialização. Como veremos, este setor contém uma cópia do nosso <filename>boot0</filename> programa. Um salto é feito pelo <acronym>BIOS</acronym> para endereçar <literal>0x7c00</literal> então começa a execução.
A special structure starting from offset <literal>0x1be</literal> in the <acronym>MBR</acronym> is called the <emphasis>partition table</emphasis>. It has four records of 16 bytes each, called <emphasis>partition records</emphasis>, which represent how the hard disk is partitioned, or, in FreeBSD's terminology, sliced. One byte of those 16 says whether a partition (slice) is bootable or not. Exactly one record must have that flag set, otherwise <filename>boot0</filename>'s code will refuse to proceed. Uma estrutura especial a partir de offset <literal>0x1be</literal> no <acronym>MBR</acronym> é chamado de <emphasis>tabela de partições</emphasis>. Tem quatro registros de 16 bytes cada, chamados <emphasis>registros de partições</emphasis>, que representam como o disco rígido é particionado, ou, na terminologia do FreeBSD, fatiado. Um byte desses 16 diz se uma partição (fatia) é inicializável ou não. Exatamente um registro deve ter esse sinalizador definido, caso contrário <filename>boot0</filename> O código da empresa se recusará a prosseguir.
A partition record descriptor contains information about where exactly the partition resides on the drive. Both descriptors, <acronym>LBA</acronym> and <acronym>CHS</acronym>, describe the same information, but in different ways: <acronym>LBA</acronym> (Logical Block Addressing) has the starting sector for the partition and the partition's length, while <acronym>CHS</acronym> (Cylinder Head Sector) has coordinates for the first and last sectors of the partition. The partition table ends with the special signature <literal>0xaa55</literal>. Um descritor de registro de partição contém informações sobre onde exatamente a partição reside na unidade. Ambos os descritores, <acronym>LBA</acronym> e <acronym>CHS</acronym>, descrevem as mesmas informações, mas de maneiras diferentes: <acronym>LBA</acronym> (Logical Block Addressing) tem o setor inicial da partição e da partição. comprimento, enquanto <acronym>CHS</acronym> (Cylinder Head Sector) tem coordenadas para o primeiro e último setores da partição.A tabela de partição termina com a assinatura especial <literal>0xaa55</literal>.
Note that the <filename>boot0.S</filename> source file is assembled <quote>as is</quote>: instructions are translated one by one to binary, with no additional information (no <acronym>ELF</acronym> file format, for example). This kind of low-level control is achieved at link time through special control flags passed to the linker. For example, the text section of the program is set to be located at address <literal>0x600</literal>. In practice this means that <filename>boot0</filename> must be loaded to memory address <literal>0x600</literal> in order to function properly. Note que o <filename>boot0.S</filename> arquivo de origem é montado <quote>como é</quote> : instruções são traduzidas uma a uma para binário, sem informações adicionais (sem formato de arquivo <acronym>ELF</acronym>, por exemplo). Esse tipo de controle de baixo nível é obtido no momento do link por meio de sinalizadores de controle especiais passados ​​para o vinculador. Por exemplo, a seção de texto do programa está configurada para estar localizada no enderço <literal>0x600</literal>. Na prática, isso significa que <filename>boot0</filename> deve ser carregado no endereço de memória <literal>0x600</literal> para funcionar corretamente.
Let us now start our study of the <acronym>MBR</acronym>, or <filename>boot0</filename>, starting where execution begins. Vamos começar agora nosso estudo do <acronym>MBR</acronym>, ou <filename>boot0</filename>, começando onde a execução começa.
Next, the destination register <literal>%di</literal> is copied to <literal>%bp</literal>. <literal>%bp</literal> gets the value <literal>0x800</literal>. The value <literal>16</literal> is copied to <literal>%cl</literal> in preparation for a new string operation (like our previous <literal>movsb</literal>). Now, <literal>stosb</literal> is executed 16 times. This instruction copies a <literal>0</literal> value to the address pointed to by the destination register (<literal>%di</literal>, which is <literal>0x800</literal>), and increments it. This is repeated another 15 times, so <literal>%di</literal> ends up with value <literal>0x810</literal>. Effectively, this clears the address range <literal>0x800</literal>-<literal>0x80f</literal>. This range is used as a (fake) partition table for writing the <acronym>MBR</acronym> back to disk. Finally, the sector field for the <acronym>CHS</acronym> addressing of this fake partition is given the value 1 and a jump is made to the main function from the relocated code. Note that until this jump to the relocated code, any reference to an absolute address was avoided. Em seguida, o registro de destino <literal>%di</literal> é copiado para <literal>%bp</literal>. <literal>%bp</literal> Obtém o valor <literal>0x800</literal>. O valor que <literal>16</literal> é copiado para <literal>%cl</literal> em preparação para uma nova operação de string (como a nossa anterior <literal>movsb</literal>). Agora, <literal>stosb</literal> é executado 16 vezes. Esta instrução copia um valor <literal>0</literal> para o endereço indicado pelo registo de destino (<literal>%di</literal>, que é <literal>0x800</literal>) e incrementa-o. Isso é repetido mais 15 vezes, então <literal>%di</literal> acaba com valor <literal>0x810</literal>. Efetivamente, isso limpa o intervalo de endereços <literal>0x800</literal> - <literal>0x80f</literal>. Esse intervalo é usado como uma tabela de partições (falsa) para gravar o <acronym>MBR de</acronym> volta no disco. Finalmente, o campo setorial para o endereçamento <acronym>CHS</acronym> desta partição falsa recebe o valor 1 e um salto é feito para a função principal a partir do código realocado. Note que até este salto para o código realocado, qualquer referência a um endereço absoluto foi evitada.
It is important to note that the active flag for each entry is cleared, so after the scanning, <emphasis>no</emphasis> partition entry is active in our memory copy of <filename>boot0</filename>. Later, the active flag will be set for the selected partition. This ensures that only one active partition exists if the user chooses to write the changes back to disk. É importante observar que a flag ativa de cada entrada é apagada, portanto, após a varredura, <emphasis>nenhuma</emphasis> entrada de partição está ativa em nossa cópia da memória de <filename>boot0</filename>. Mais tarde, a flag ativa será definida para a partição selecionada. Isso garante que apenas uma partição ativa existiré se o usuário optar por gravar as alterações novamente no disco.
The next block tests for other drives. At startup, the <acronym>BIOS</acronym> writes the number of drives present in the computer to address <literal>0x475</literal>. If there are any other drives present, <filename>boot0</filename> prints the current drive to screen. The user may command <filename>boot0</filename> to scan partitions on another drive later. O próximo bloco testa as outras unidades. Na inicialização, a <acronym>BIOS</acronym> grava o número de unidades presentes no computador para o endereço <literal>0x475</literal> . Se houver outras unidades presentes, <filename>boot0</filename> imprime a unidade atual na tela. O usuário pode comandar <filename>boot0</filename> para varrer partições em outra unidade depois.
We make the assumption that a single drive is present, so the jump to <literal>print_drive</literal> is not performed. We also assume nothing strange happened, so we jump to <literal>print_prompt</literal>. Supomos que uma única unidade está presente, então o salto para <literal>print_drive</literal> não é executado. Nós também assumimos que nada de estranho aconteceu, então nós pulamos para <literal>print_prompt</literal>.
Recall that <literal>%si</literal> points to the selected partition entry. This entry tells us where the partition begins on disk. We assume, of course, that the partition selected is actually a FreeBSD slice. Lembre-se que <literal>%si</literal> aponta para a entrada da partição selecionada. Esta entrada nos diz onde a partição começa no disco. Nós assumimos, é claro, que a partição selecionada é na verdade uma fatia do FreeBSD.
The transfer buffer is set to <literal>0x7c00</literal> (register <literal>%bx</literal>), and a read for the first sector of the FreeBSD slice is requested by calling <literal>intx13</literal>. We assume that everything went okay, so a jump to <literal>beep</literal> is not performed. In particular, the new sector read must end with the magic sequence <literal>0xaa55</literal>. Finally, the value at <literal>%si</literal> (the pointer to the selected partition table) is preserved for use by the next stage, and a jump is performed to address <literal>0x7c00</literal>, where execution of our next stage (the just-read block) is started. O buffer de transferência está definido para <literal>0x7c00</literal> (registrador <literal>%bx</literal> ), e uma leitura para o primeiro setor da slice do FreeBSD é solicitada chamando <literal>intx13</literal> . Nós assumimos que tudo correu bem, então um salto para o <literal>beep</literal> não é executado. Em particular, o novo setor lido deve terminar com a sequência mágica <literal>0xaa55</literal>. Finalmente, o valor em <literal>%si</literal> (o ponteiro para a tabela de partições selecionada) é preservado para uso pelo próximo estágio, e um salto é executado para o endereço <literal>0x7c00</literal> , onde a execução do nosso próximo estágio (o bloco de apenas-leitura) é iniciado.
There is a file <filename>/boot/boot1</filename>, but it is not the written to the beginning of the FreeBSD slice. Instead, it is concatenated with <filename>boot2</filename> to form <filename>boot</filename>, which <emphasis>is</emphasis> written to the beginning of the FreeBSD slice and read at boot time. Existe um arquivo <filename> / boot / boot1 </filename> , mas não é o escrito para o começo da fatia do FreeBSD. Em vez disso, é concatenado com <filename> boot2 </filename> formar <filename> bota </filename>, o qual <emphasis> é </emphasis> escrito para o inicio da fatia do FreeBSD e lido no momento da inicialização.
This is necessary for legacy reasons. Interested readers should see <link xlink:href="http://en.wikipedia.org/wiki/A20_line"/>. Isso é necessário por razões de legado. Os leitores interessados ​​devem ver <link xlink:href="http://en.wikipedia.org/wiki/A20_line"/>