Projeto divertido: bootar kernel do OpenBSD via syslinux

11 views
Skip to first unread message

Fabio Olive Leite

unread,
Jun 24, 2011, 10:18:02 AM6/24/11
to OeSC-Livre
Olá!

Faz algum tempo já que venho pensando numa forma mais fácil de bootar o
instalador do OpenBSD através de uma pendrive simples, sem ter que
criar uma partição tipo OpenBSD e disklabels na pendrive. O processo de
boot do OpenBSD não é muito flexível, e bastante orientado a quem já
tem um OpenBSD instalado ou pode bootar via CD.

O syslinux é um boot loader bem genérico, pode carregar quase qualquer
coisa incluindo programas COM, COM32 (padrão COM em 32bits com modelo
de memória flat), ELF (mas infelizmente não funciona com o bsd.rd) e
assemelhados que por sua vez podem carregar qualquer coisa. Pra ajudar,
o syslinux inclusive implementa uma série de serviços via int 21h e 22h
para abrir arquivos na partição FAT, mostrar mensagens e etc.

Acaba que um pendrive com FAT mesmo e syslinux instalado se torna uma
ferramenta bem útil para bootar quase qualquer coisa a qualquer hora.
E dá pros antigos fazerem programinhas em assembly em modo real 16 bits
pra matar a saudade.

Mas, voltando ao assunto. Faz tempo que venho pensando como uma pessoa
que quer bootar o instalador do OpenBSD e só tem Linux ou Windows e uma
pendrive (em casos que não dá pra bootar via CD ou floppy (fala sério))
poderia fazer pra criar esse ambiente de boot.

Não deve ser difícil, basicamente precisamos saber onde o kernel do
OpenBSD gosta de ser carregado, qual modelo de memória e segmentos ele
espera encontrar no GDT (e IDT?), e talvez quais parâmetros na stack ou
nos registradores, e finalmente, pra qual endereço a gente pula depois
de carregar ele e configurar aquilo tudo.

Ontem de noite eu perdi o sono e resolvi brincar um pouco com isso, e
fiz um minúsculo programinha em assembly pro syslinux que carrega e
pula pro bootloader original do OpenBSD, que geralmente fica em /boot
(é um arquivo, não uma partição). Foi fácil, visto que esse bootloader
dele é feito pra ser carregado em modo real 16 bits mesmo, e só espera
receber dois parâmetros na pilha.

O código ASM ficou assim (obsdboot.asm):

-----8<-----8<-----
bits 16
org 0x100
section .text

start:
mov ax, 0x0006 ; open file function
mov si, file ; name
int 0x22 ; call syslinux
mov cx, ax ; reuse size in cx
mov ax, 0x4000 ; load segment
mov es, ax ; into es
xor bx, bx ; load offset
mov ax, 0x0007 ; read file function
int 0x22 ; call syslinux
push 0x0000 ; push drive in 32bits
push 0x0080 ; first hd is 0x80
push 0xd00d ; MAGICBOOT constant
push 0xc001 ; is 0xc001d00d
jmp 0x4012:0x0000 ; jump to boot's link address

section .data
file: db "boot", 0
-----8<-----8<-----

Notem que eu usei notação Intel no ASM (foi o que aprendi na infância
perdida nos bits). Isso pode ser montado com o NASM assim:

$ nasm -f bin -o obsdboot.cbt obsdboot.asm

Essa extensão CBT diz pro syslinux que o executável é um COMBOOT, ou
seja, formato COM porém feito para rodar no ambiente reduzido de
serviços BIOS disponíveis durante o boot.

Se montarem corretamente, o obsdboot.cbt terá estes 45 bytes:

$ hexdump -C obsdboot.cbt
00000000 b8 06 00 be 28 01 cd 22 89 c1 b8 00 40 8e c0 31 |....(.."....@..1|
00000010 db b8 07 00 cd 22 6a 00 68 80 00 68 0d d0 68 01 |....."j.h..h..h.|
00000020 c0 ea 00 00 12 40 00 00 62 6f 6f 74 00 |.....@..boot.|
0000002d

Se vocês instalarem o syslinux numa pendrive, copiarem esse arquivo
e o bootloader do OpenBSD (/boot) pra dentro dela, bootarem por ela
e escreverem obsdboot no prompt do syslinux, cairão imediatamente no
conhecido prompt do bootloader do OpenBSD. Aí ele vai procurar uma
partição tipo A6, o que não queremos, mas vale a experiência. :)

Alternativamente, é fácil criar uma imagem pra testar isso com qemu
usando os seguintes comandos:

$ mkdosfs -C boot.img 16384
$ syslinux -i boot.img
$ mcopy -i boot.img obsdboot.cbt ::
$ mcopy -i boot.img boot ::
$ qemu -net none boot.img

BOM, o ponto em que quero chegar, é que seria bem interessante poder
carregar o bsd.rd diretamente no prompt do syslinux. Eu já tentei com
os módulos elf.c32, pmload.c32, cd49.iso via memdisk, e até agora nada.

UPDATE: fuçador é triste. casualmente enquanto escrevia o email acabei
testando a imagem floppy49.fs via memdisk e funcionou, mas não é uma
solução muito boa porque pela óbvia limitação de espaço essa imagem é
extremamente limitada nos drivers.

UPDATE: preparem então uma pendrive com syslinux (eu prefiro sempre
refazer a partição FAT, pois muitos pendrives vem de fábrica com uma
partição meio bagunçada, e não esqueçam de marcar como bootável) usando
syslinux -i /dev/sdb1 (usem o nome certo), copiem o arquivo
/usr/share/syslinux/memdisk pra pendrive e copiem a imagem floppy49.fs
(ftp://ftp.openbsd.org.ar/pub/OpenBSD/snapshots/i386/floppy49.fs) com
o nome floppy49.img (acho que o memdisk gosta de "img") e, ao bootar,
digitem "memdisk initrd=floppy49.img" no prompt do syslinux.

ENFIM, alguém se interessa em estudar um pouco o bootloader do OpenBSD
pra que a gente consiga fazer um loader que carregue o bsd.rd direto
via syslinux? O nome proposto é obsdload. :)

Abraços!

--
[[ Fábio Olivé Leite, olive, FabioOlive ]]
TcheLinux.org, OeSC-Livre.org, Chapecó, SC
ex sed lex awk yacc, e pluribus unix, amem

Fabio Olive Leite

unread,
Jun 24, 2011, 8:02:46 PM6/24/11
to OeSC-Livre
:D

On 2011-06-24 Fabio Olive Leite wrote:
>
> O syslinux é um boot loader bem genérico, pode carregar quase qualquer
> coisa incluindo programas COM, COM32 (padrão COM em 32bits com modelo
> de memória flat), ELF (mas infelizmente não funciona com o bsd.rd)

Hmm talvez não seja tão complexo. Eu vi com objdump que o bsd.rd é
linkado para rodar a partir do endereço virtual 0xd0200120 (lá pelos
3.25GB), porém isso é depois que o código inicial preparar a VM para
mapear a memória física a partir de 0xd0000000 (acho). Isso significa
que o endereço físico de carga inicial é nos 0x00200120, que dá um
pouco acima dos 2MB.

Abri o bsd.rd com o hexedit e alterei o header ELF e os headers das
seções do arquivo, subtraindo 0xd0000000 dos endereços de carga, e eis
que agora o utilitário elf.c32 do syslinux consegue carregá-lo e saltar
pra ele. :) Dá um panic imediato reclamando que o /boot é muito velho,
pois certamente o elf.c32 está carregando certo porém não passa os
parâmetros que o bsd.rd está esperando na pilha.

Acho que no fim será razoavelmente fácil fazer um loader baseado no
elf.c32 que saiba subtrair os 0xd0000000 na hora da carga e configurar
os parâmetros na pilha. :)

Jones Muneron

unread,
Jun 24, 2011, 10:05:18 PM6/24/11
to oesc-...@googlegroups.com
Olá Fábio, meus parabéns pela aula!!! é algo interessante isso que tu coloco aí, porém nem sempre damos os devidos valores.
ps. pena que eu não me interessei e não dei continuidade na programação assembly que tive na faculdade, pra poder continuar a trocar idéia e incrementar ao conhecimento.


Atenciosamente,
Jones Muneron

Site do OeSC-Livre
http://www.oesc-livre.org/
------------------------------------------------




--
Mensagem enviada para <http://groups.google.com/group/oesc-livre>

Ionar Michielin

unread,
Jun 25, 2011, 2:28:12 PM6/25/11
to oesc-...@googlegroups.com
Muito interessante Fábio, mas está muito além dos meus conhecimentos....
Por favor, continue postando os seus resultados na lista.

Abraços!!!

 Ionar Rafael Michielin
 Fone:  [49] 9998-3809
 e-Mail/MSN: i...@ionar.com.br
 São Miguel do Oeste, SC

Em 24 de junho de 2011 21:02, Fabio Olive Leite
<fabio...@gmail.com> escreveu:

Fabio Olive Leite

unread,
Jun 26, 2011, 7:28:07 PM6/26/11
to oesc-...@googlegroups.com
Olá!

On 2011-06-24 Jones Muneron wrote:
> Olá Fábio, meus parabéns pela aula!!! é algo interessante isso que tu
> coloco aí, porém nem sempre damos os devidos valores.

Que nada, foi só um pouco de escovação de bits hehehe. Pra contrastar
um pouco com as programações web super-alto-nível de hoje em dia.

> ps. pena que eu não me interessei e não dei continuidade na
> programação assembly que tive na faculdade, pra poder continuar a
> trocar idéia e incrementar ao conhecimento.

Hmmm se houver um público interessado um dia eu poderia preparar uma
palestra/aula sobre assembly x86 e como funciona o processo de boot,
com exemplos práticos usando syslinux, grub, GAG e muita edição em
hexadecimal com hexedit ou similares hehehe. :D

Alvaro Pagliari

unread,
Jun 26, 2011, 7:50:28 PM6/26/11
to oesc-...@googlegroups.com
Olá!
Fábio, eu tenho interesse em assistir essa palestra. Mas acho q ela se encaixa melhor como mini-curso (pq demanda mais tempo).
Talvez ela possa ser realizada nos próximos eventos do grupo?
flww

--
Álvaro Gianni Pagliari
alvaropag [at] gmail [dot] com


Marcelo Junior

unread,
Jun 27, 2011, 8:55:32 AM6/27/11
to oesc-...@googlegroups.com
Opa, eu estaria interessado em participar caso saísse algum mini-curso.
--
                                                                                          

Marcelo I. Machado Júnior
===================
ADM Sistemas
Xanxerê - SC

Jones Muneron

unread,
Jun 27, 2011, 9:13:20 AM6/27/11
to oesc-...@googlegroups.com
Eu tenho interesse também!



Atenciosamente,
Jones Muneron

Site do OeSC-Livre
http://www.oesc-livre.org/
------------------------------------------------




Guilherme Cunha

unread,
Jun 27, 2011, 7:53:15 AM6/27/11
to oesc-...@googlegroups.com
To dentro ...

Via dimdim ?

:D

Abraço!

Atenciosamente,
Guilherme Cunha
http://www.bravahost.com.br


Em 26 de junho de 2011 20:50, Alvaro Pagliari <alva...@gmail.com> escreveu:

Marcelo Junior

unread,
Jun 27, 2011, 10:32:46 AM6/27/11
to oesc-...@googlegroups.com
Estou pensando em fazer um sistema em ASM... aushusa.. capaz. É bom ter esse conhecimento do core da coisa toda. Hoje em dia as universidades não passam mais essa coisa divertida.

Fabio Olive Leite

unread,
Jun 27, 2011, 11:26:06 AM6/27/11
to oesc-...@googlegroups.com
Olá!

On 2011-06-27 Marcelo Junior wrote:
> Estou pensando em fazer um sistema em ASM... aushusa.. capaz. É bom
> ter esse conhecimento do core da coisa toda. Hoje em dia as
> universidades não passam mais essa coisa divertida.

Sim, isso é uma pena. O foco hoje é todo em webs e assemelhados, como
se os computadores não fizessem hoje o mesmo processo de boot que vêm
fazendo há 30 anos. Uma boa disciplina de arquitetura de computadores
deveria, pelo menos no final, cobrir um pouco de assembly x86 e o
processo de boot dos computadores (com exemplos, não só teórico).

MAS, é aí que entra o OeSC-Livre pra nos salvar! Já percebi que existe
interesse, então vou propor em outro tópico que a gente organize um
dojo sobre estes assuntos relacionados a software básico.

Abraços!

Alvaro Pagliari

unread,
Jun 27, 2011, 11:31:32 AM6/27/11
to oesc-...@googlegroups.com

Um curso de shell script tb seria legal.

Em 27/06/2011 12:26, "Fabio Olive Leite" <fabio...@gmail.com>escreveu:

Olá!


On 2011-06-27 Marcelo Junior wrote:

> Estou pensando em fazer um sistema em ASM... aushusa.. capaz....

Sim, isso é uma pena. O foco hoje é todo em webs e assemelhados, como
se os computadores não fizessem hoje o mesmo processo de boot que vêm
fazendo há 30 anos. Uma boa disciplina de arquitetura de computadores
deveria, pelo menos no final, cobrir um pouco de assembly x86 e o
processo de boot dos computadores (com exemplos, não só teórico).

MAS, é aí que entra o OeSC-Livre pra nos salvar! Já percebi que existe
interesse, então vou propor em outro tópico que a gente organize um
dojo sobre estes assuntos relacionados a software básico.

Abraços!

--

[[ Fábio Olivé Leite, olive, FabioOlive ]]
TcheLinux.org, OeSC-Livre.org, Chapecó, SC

ex sed lex awk...

Reply all
Reply to author
Forward
0 new messages