Olá Habr!
Meu nome é Victor e este ano sou o único aluno do programa Google Summer of Code no projeto ReactOS. Hoje vou falar um pouco sobre o que faço como parte do estágio.
O ReactOS suporta vários tipos de sistemas de arquivos diferentes para leitura e gravação (fat32, ext2,
ReiserFS ,
BTRFS ), no entanto, ainda pode ser inicializado apenas a partir de uma partição formatada no fat32. Na primavera, decidi que era hora de começar a corrigir essa situação e solicitei o GSoC. E assim, alguns meses depois, escrevo este post :)
Por que BTRFS? A resposta é simples - o
driver do sistema de arquivos
WinBtrfs é atualmente o mais estável e totalmente funcional de todos os que estão incluídos no código ReactOS. Nesse estágio, queremos corrigir os erros do kernel que impedem o uso de outros FS para carregar, para que os erros do driver do FS sejam completamente inúteis para nós.

Mas tive que começar não a partir do kernel do sistema operacional, mas a partir do instalador. Felizmente, quase tudo estava pronto para o instalador: bastava habilitar o carregamento do driver WinBtrfs em nosso instalador (usetup) e adicionar algumas linhas de código para suportar a formatação no sistema de arquivos necessário. Depois disso, eu consegui (quase) facilmente copiar os arquivos ReactOS para a partição formatada em BTRFS.
Eles rapidamente lidaram com o instalador, mas a próxima tarefa é muito mais interessante. O carregador de inicialização ReactOS - FreeLdr suporta quase apenas dois sistemas de arquivos - fat32 e iso (há código para ext2 e ntfs, mas ninguém tenta executá-lo há cerca de 5 anos). Como o FreeLdr repete o princípio do gerenciador de inicialização ntldr da MS, ele consiste em duas partes - o setor de inicialização no início da seção em que o MBR é transferido para o disco e a parte principal, que coloca o processador no modo protegido, carrega o kernel ntoskrnl.exe na memória e faz um monte de tudo.
(é assim que o processo de inicialização do ReactOS se parece)Portanto, para oferecer suporte ao novo sistema de arquivos, você precisa gravar o registro de inicialização da partição (VBR), cuja tarefa é encontrar o arquivo executável da parte principal do gerenciador de inicialização (chamamos de freeldr.sys) no diretório raiz do disco, carregá-lo na memória e transferir o controle para ele. Mas isso não é tudo, o próprio freeldr.sys precisa de um driver de sistema de arquivos somente leitura quase completo para ler os arquivos de configuração, o kernel, os arbustos de registro etc.
Primeiro, você tinha que lidar com o próprio sistema de arquivos BTRFS. Antes disso, as coisas mais difíceis que eu escolhi foram fat32 e ext2, por isso levei muito tempo para aprender o harvester BTRFS. A documentação no
wiki.kernel.org ajuda a descobrir, mas para entendê-la completamente, não bastava - você tinha que ir às fontes do grub, u-boot e outros gerenciadores de inicialização. O
utilitário python que escrevi para gerar as estruturas do sistema de arquivos no console acabou sendo muito útil para estudar a estrutura do sistema de arquivos. Utilizando-o, escrevi o primeiro protótipo do setor de inicialização, que extrai o carregador de inicialização de um arquivo binário com uma imagem de disco com o sistema de arquivos BTRFS.
(os elementos do diretório raiz são visíveis na figura)Agora é hora do setor de inicialização real. É complicado pelo fato de aqui estarmos trabalhando em um modo de processador real com todas as conseqüências resultantes (~ 1 MB de memória, endereçamento segmentado e trabalho com um disco através de interrupções do BIOS). Extensão para os fãs da velha escola como eu :)
Nas estruturas BTRFS, quase todos os campos têm tamanho de 64 bits, um código muito "inchado", pois as instruções x86 de 32 bits precisavam ser ativamente usadas. Muitas vezes você tem que usar construções como:
mov si, SOME_OFFSET lea si, [esi+ecx*8] lea si, [esi+ecx*8] lea si, [esi+ecx*8] // one element is 24 bytes long
A tarefa mais demorada foi escrever o procedimento de travessia da árvore b; levou mais tempo para depurá-lo. E depois de várias noites sem dormir, ainda consegui receber a cobiçada mensagem de erro do segundo estágio de download:

freeldr.sys conseguiu carregar com sucesso na memória e nem precisou usar mágica como o
Unreal Mode . 640kb é suficiente para todos!
O código do setor de inicialização pode ser visualizado no meu repositório do
github (a refatoração ainda o aguarda) e todo o trabalho no BTRFS
neste segmento.
Agora é a vez da segunda parte do carregador de inicialização - você precisa ensiná-lo a ler o arquivo de configuração do novo sistema de arquivos. Acompanhe as novidades!