Nós escrevemos um sistema operacional. Parte 1. Carregadeira

Olá a todos! Hoje vamos escrever um gerenciador de inicialização que exibirá "Hello World" e o executará no VirtualBox. Vamos escrever em assembler FASM. Você pode baixá-lo aqui . Também precisaremos do VirtualBox e UltraISO . Antes de escrever o código, entenderemos como os sistemas operacionais são carregados.

Portanto, quando pressionamos o grande botão liga / desliga do computador, o sistema é iniciado, que está em qualquer computador - BIOS (sistema básico de entrada / saída ou sistema básico de entrada / saída). A tarefa do BIOS é:


  1. Detecte todos os dispositivos conectados e verifique sua operabilidade. O programa POST (Autoteste de inicialização, autoteste de inicialização) é responsável por isso. Se o ferro vital não for detectado, o alto-falante do sistema (se houver) guiará algo incompreensível e o download não irá mais longe.
  2. Forneça ao sistema operacional funções para trabalhar com hardware.
  3. Leia o primeiro setor do dispositivo de inicialização no segmento zero da RAM no deslocamento 0x7C00h e transfira o controle para lá. 1 setor no disco tem 512 bytes. Portanto, nosso carregador de inicialização não deve exceder 512 bytes. O BIOS determina que o setor é inicializável pela presença de 0x55 e 0xAA em seus últimos dois bytes.

Agora você pode começar a escrever o código. Execute o arquivo FASMW.EXE, localizado no arquivo morto com FASM, e insira o seguinte código:

org 7C00h

 start:
    cli              ;  (   )
    xor ax, ax       ;  ax
    mov ds, ax       ; dataSegment   
    mov es, ax       ;  es   
    mov ss, ax       ; StackSegment   
    mov sp, 07C00h   ;    
    sti              ; 

  ; 
  mov ax, 3
  int 10h

  mov ah, 2h
  mov dh, 0
  mov dl, 0
  xor bh, bh
  int 10h

  ; 
  mov ax, 1301h
  mov bp, message
  mov cx, 12
  mov bl, 02h
  int 10h

  jmp $

message db 'Hello World!',0

times 510 - ($ - $$) db 0 ;     510- 
db 0x55, 0xAA ;   

Este código requer uma pequena explicação. O time

org 7C00h

dizemos que o código precisa ser carregado na RAM em 0x7C00. Nas linhas

  mov ax, 3
  int 10h

configuramos o modo de vídeo para 80x25 (80 caracteres por linha e 25 linhas) e, assim, limpamos a tela.

  mov ah, 2h
  mov dh, 0
  mov dl, 0
  xor bh, bh
  int 10h

Aqui nós ajustamos o cursor. A função 2h interrupção 10h é responsável por isso. No registro dh, colocamos a coordenada do cursor em Y e no registro dl em X.

  mov ax, 1301h
  mov bp, message
  mov cx, 12
  mov bl, 02h
  int 10h

Nós imprimimos uma linha. A função 13h interrupção 10h é responsável por isso. No registrador bp, colocamos a própria string, no registrador cx, o número de caracteres na string, no registrador bl, o atributo; no nosso caso, a cor será verde. Os primeiros 4 bits afetam a cor do plano de fundo, os segundos 4 bits afetam a cor do texto. Abaixo está a cartela de cores

0 - , 1 - , 2 - , 3 - , 4 - , 5 - , 6 - , 7 - -, 8 - -, 9 - -, A - -, B - -, C - -, D- -, E - -, F – .

Na linha

jmp $

O programa congela.

Compilamos o código pressionando Ctrl + F9 e salvamos o arquivo resultante como boot.bin.

Lançamento


Inicie o UltraISO e arraste nosso binário para uma área especial (marcada com uma seta vermelha).



Em seguida, clique com o botão direito do mouse no binarink e pressione o botão com a seguinte inscrição: “Instalar como arquivo de inicialização”. Em seguida, salve nosso arquivo no formato ISO.
Abra o VIrtualBox e crie uma nova máquina virtual (se você não souber como fazer isso, clique aqui ). Então, depois de criar a máquina virtual, clique em "Configurar, selecione o item" Mídia ", clique em" Vazio ", onde" Unidade "é o ícone do disco óptico. Nós clicamos nele e selecionamos “Selecionar imagem de disco óptico”, procuramos nosso arquivo ISO, clique em “Abrir”. Salvamos todas as configurações e iniciamos a máquina virtual. Nosso "Olá, mundo!" Aparece na tela.



Sobre isso, a primeira edição chega ao fim. Na próxima parte, ensinaremos nosso gerenciador de inicialização a ler setores de disco e inicializar seu primeiro kernel!


All Articles