
O Oreboot é um garfo a jusante de Coreboot, ou seja, Oreboot é Coreboot sem 'C'.
O oreboot é escrito principalmente em ferrugem, com montagem quando necessário.
Atualmente, o Oreboot planeja suportar cargas úteis do LinuxBoot.
oreboot ?
v 13
cpu_pll fa001000
cpu_axi 5000100
cpu_axi 5000100
peri0_ctrl was: f8216300
peri0_ctrl lock en
peri0_ctrl PLLs
peri0_ctrl set: f8216300
DDR3@792MHz
test OK
512M ?
NOR flash: c2/2018
load 00018000 bytes to 40000000: ➡️.
load 00fc0000 bytes to 44000000: ➡️➡️➡️➡️➡️➡️➡️➡️➡️➡️➡️➡️➡️➡️➡️➡️.
load 00010000 bytes to 41a00000: ➡️.
{ɕ serial uart0 initialized
RISC-V vendor 5b7 arch 0 imp 0
==== platform CSRs ====
MXSTATUS c0408000
MHCR 00000109
MCOR 00000002
MHINT 00004000
see C906 manual p581 ff
=======================
Set up extension CSRs
==== platform CSRs ====
MXSTATUS c0638000
MHCR 0000017f
MCOR 00000003
MHINT 0000610c
see C906 manual p581 ff
=======================
timer init
reset init
ipi init
RustSBI version 0.3.1
.______ __ __ _______.___________. _______..______ __
| _ | | | | / | | / || _ | |
| |_) | | | | | | (----`---| |----`| (----`| |_) || |
| / | | | | | | | _ < | |
| | ----.| `--' |.----) | | | .----) | | |_) || |
| _| `._____| ______/ |_______/ |__| |_______/ |______/ |__|
Platform Name: T-HEAD Xuantie Platform
Implementation: oreboot version 0.1.0
[rustsbi] misa: RV64ACDFIMSUVX
[rustsbi] mideleg: ssoftstimersext (0x222)
[rustsbi] medeleg: imaialmalasmasauecallipagelpagespage(0xb1f3)
[rustsbi] mie: msoft ssoft mtimer stimer mext sext (00000aaa)
PMP0 0x0 - 0x40000000 (A,R,W,X)
PMP1 0x40000000 - 0x40200000 (A,R)
PMP2 0x40200000 - 0x80000000 (A,R,W,X)
PMP3 0x80000000 - 0x80200000 (A,R)
PMP4 0x80200000 - 0xfffff800 (A,R,W,X)
PMP8 0x0 - 0x0 (A,R,W,X)
DTB looks fine, yay!
Decompress 12375521 bytes from 0x44000004 to 0x40200000, reserved 25165824 bytes
Success, decompressed 21910144 bytes :)
Payload looks like Linux Image, yay!
DTB still fine, yay!
Handing over to SBI, will continue at 0x40200000
enter supervisor at 40200000 with DTB from 41a00000
...
[ 0.000000] OF: fdt: Ignoring memory range 0x40000000 - 0x40200000
[ 0.000000] Machine model: Sipeed Lichee RV Dock
[ 0.000000] earlycon: sbi0 at I/O port 0x0 (options '')
[ 0.000000] printk: bootconsole [sbi0] enabled
[ 0.000000] Zone ranges:
[ 0.000000] DMA32 [mem 0x0000000040200000-0x000000005fffffff]
[ 0.000000] Normal empty
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000040200000-0x000000005fffffff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000040200000-0x000000005fffffff]
[ 0.000000] riscv: SBI specification v1.0 detected
[ 0.000000] riscv: SBI implementation ID=0x4 Version=0x301
[ 0.000000] riscv: SBI TIME extension detected
[ 0.000000] riscv: SBI IPI extension detected
[ 0.000000] riscv: SBI SRST extension detected
[ 0.000000] riscv: base ISA extensions acdfim
[ 0.000000] riscv: ELF capabilities acdfim
[ 0.000000] percpu: Embedded 17 pages/cpu s31912 r8192 d29528 u69632
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 128520
[ 0.000000] Kernel command line: console=tty0 console=ttyS0,115200 loglevel=7 earlycon=sbi

Construímos em cima das abstrações do modelo do grupo de trabalho incorporado à ferrugem com suas caixas e características, detalhadas em seu livro.
Em poucas palavras: 
Espera -se que os fornecedores do SOC forneçam documentação a seus núcleos, periféricos e outros blocos e/ou seus arquivos SVD, para que possamos gerar as caixas PAC e HAL, ou, idealmente, o fornecedor deve fornecer e mantê -los também.
O livro incorporado à ferrugem oferece padrões de design e diretrizes de implementação, bem como um glossário para entender a estrutura.
Para obter uma compreensão geral de como o Oreboot e o firmware em obras gerais, dê uma olhada na documentação do fluxo de inicialização. Ele descreve como o firmware é armazenado e inicializa em uma plataforma / soc.
Observe que o Oreboot não tem como objetivo se transformar em seu próprio sistema operacional. Consequentemente, pretendemos manter a quantidade e a funcionalidade dos motoristas baixos. No entanto, pelo design do SOCS, temos que implementar algo para carregar o código:
Em muitos casos, nenhum driver completo é necessário, pois precisamos apenas ler o armazenamento e não precisamos de sistemas de arquivos ricos. Para evitar colidir com as necessidades e detalhes de um sistema operacional, recomendamos que separe claramente as peças de armazenamento que mantêm o firmware e o sistema operacional, respectivamente. Por exemplo, coloque o firmware em um flash SPI e o sistema operacional em um SSD NVME.
Clone este repositório e entre em seu diretório, ou seja:
git clone https://github.com/oreboot/oreboot.git
cd orebootEm geral, você precisará dos seguintes pacotes instalados:
device-tree-compilerpkg-configlibsslrustup Para os sistemas baseados em Debian, há um alvo para instalar aqueles, que puxam rustup através do Curl de https://sh.rustup.rs:
make debiansysprepareCaso contrário, instale o pacote através do seu gerenciador de pacotes do sistema.
Independentemente do seu sistema operacional, você precisará instalar a cadeia de ferramentas para Oreboot. Este comando só precisa ser feito uma vez, mas é seguro fazê -lo repetidamente.
make firsttimeCada vez que você começa a trabalhar com Oreboot, ou mesmo diariamente:
cd oreboot
make updateVocê definitivamente deve fazer isso antes de relatar quaisquer problemas.
Existem duas coisas diferentes no projeto:
src/mainboards/* os alvos reais; Aqueles dependem e compartilham caixas, que podem ser motoristas, código SOC INIT e similares. Para as pranchas, Cargo.lock deve ser rastreado.src/* tudo o mais; Estas são as caixas acima mencionadas, para as quais, não rastreamos os arquivos Cargo.lock . Verificando o arquivo Cargo.lock de uma placa principal.Lock registra o estado de suas dependências no momento de uma compilação bem -sucedida, permitindo a reprodutibilidade. Idealmente, um arquivo de bloqueio é atualizado seguindo a inicialização bem -sucedida no hardware.
Para mais, veja: https://doc.rust-lang.org/cargo/faq.html#why-do-binaries-have-cargolock-in-version
Ao criar uma nova placa principal, observar como os outros são configurados para a mesma arquitetura é um bom começo. Esteja ciente de que o Oreboot está direcionado para o metal nu, portanto, não há biblioteca padrão disponível.
Para construir Oreboot para uma plataforma específica, faça isso:
# Go to the mainboard's directory
cd src/mainboard/sunxi/nezha
# Build the mainboard target
make mainboard
# View disassembly
make objdump
# Run from RAM without flashing
make run
# Flash to the board
make flash
O root Makefile permite que você construa rapidamente todas as plataformas:
# build all mainboards
make mainboards
# build everything in parallel
make -j mainboards
# Install QEMU for your target platform, e.g. x86
sudo apt install qemu-system-x86
# Build release build and start with QEMU
cd src/mainboard/emulation/qemu-q35 && make run
# Quit qemu with CTRL-A X
Para construir Qemu a partir da fonte para RISC-V:
git clone https://github.com/qemu/qemu && cd qemu
mkdir build-riscv64 && cd build-riscv64
../configure --target-list=riscv64-softmmu
make -j$(nproc)
# QEMU binary is at riscv64-softmmu/qemu-system-riscv64
Para construir Qemu a partir da fonte do AARCH64:
git clone https://github.com/qemu/qemu && cd qemu
mkdir build-aarch64 && cd build-aarch64
../configure --target-list=aarch64-softmmu
make -j$(nproc)
# QEMU binary is at aarch64-softmmu/qemu-system-aarch64
Semelhante ao Coreboot, a estrutura no Oreboot é por fornecedor e placa principal. Múltiplas arquiteturas e SOCs são suportados, respectivamente, e seu código comum é compartilhado entre as placas. As placas podem ter variantes se pequenos desvios causariam muita duplicação de código.
qemu-riscvPara referência, abordagens anteriores estão documentadas. Dê uma olhada naqueles para plataformas e praias x86 e braço.
As metas anteriores de emulação foram estacionadas em src.broken/mainboard/emulation/ . Eles devem fornecer um entendimento geral de cada arquitetura que o Oreboot procura apoiar:
qemu-armv7qemu-aarch64qemu-q35Makefile s deve ser simples. Use xtask em vez disso para fluxo de controle, por exemplo, adicionar cabeçalhos ou somas de cheques aos binários, imagens sitching, etc.Cargo.toml na respectiva src/mainboard/$VENDOR/$BOARDmake format sem exceções. Uma verificação do CI dirá se uma alteração não adere às regras de formatação.Os direitos autorais do Oreboot são de propriedade de um grande número de desenvolvedores e empresas individuais. Verifique os arquivos de origem individuais para obter detalhes.
O oreboot é licenciado nos termos da Licença Pública Geral (GPL) da GNU. Alguns arquivos são licenciados no "GPL (versão 2 ou qualquer versão posterior)", e alguns arquivos são licenciados no "GPL, versão 2". Para algumas peças, derivadas de outros projetos, outras licenças (compatíveis com GPL) podem ser aplicadas. Verifique os arquivos de origem individuais para obter detalhes.
Isso faz com que as imagens de Oreboot resultantes licenciadas no GPL, versão 2.