Minimální úvodní program hello world krok za krokem
Zkompilujte ahoj svět bez jakýchkoli závislostí, který končí v nekonečné smyčce. init.S
:
.global _start
_start:
mov $1, %rax
mov $1, %rdi
mov $message, %rsi
mov $message_len, %rdx
syscall
jmp .
message: .ascii "FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n"
.equ message_len, . - message
Nemůžeme použít systémové volání exit, jinak jádro zpanikaří, jediný způsob, jak elegantně ukončit init, je vypnout počítač pomocí reboot
systémové volání.
Potom:
mkdir d
as --64 -o init.o init.S # assemble
ld -o d/init init.o # link
cd d
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
ROOTFS_PATH="$(pwd)/../rootfs.cpio.gz"
Toto vytvoří souborový systém s naším hello world na /init
, což je první uživatelský program, který jádro spustí. Mohli jsme také přidat více souborů do d/
a byly by přístupné z /init
program, když běží jádro.
Potom cd
do stromu jádra Linuxu, sestavení jako obvykle a spusťte jej v QEMU:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
git checkout v4.9
make mrproper
make defconfig
make -j"$(nproc)"
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -initrd "$ROOTFS_PATH"
A měli byste vidět řádek:
FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR
na obrazovce emulátoru! Všimněte si, že to není poslední řádek, takže se musíte podívat o něco výše.
Můžete také použít programy C, pokud je propojíte staticky:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
sleep(0xFFFFFFFF);
return 0;
}
s:
gcc -static init.c -o init
Dynamické propojení by vyžadovalo nastavení spustitelného dynamického linkeru, z nichž nejběžnější jsou součástí standardních knihoven C, jako je glibc.
Můžete běžet na skutečném hardwaru s USB na /dev/sdX
a:
make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
Skvělý zdroj na toto téma:Technický tip:Jak používat initramfs | landley.net Také vysvětluje, jak používat gen_initramfs_list.sh
, což je skript ze zdrojového stromu linuxového jádra, který pomáhá automatizovat proces.
Testováno na Ubuntu 16.10, QEMU 2.6.1.
Další kroky
Další věc, kterou chcete udělat, je nastavit BusyBox.
BusyBox implementuje základní nástroje POSIX-y CLI, včetně shellu POSIX-y, který vám umožní snáze interaktivně experimentovat se systémem.
Osobně se v tuto chvíli raději spoléhám na Buildroot, což je úžasná sada skriptů, která automatizuje vytváření všeho ze zdroje a vytváření kořenového souborového systému.
Nahrál jsem k tomu velmi podrobného a automatizovaného pomocníka na:https://github.com/cirosantilli/linux-kernel-module-cheat
Nezačal bych si zahrávat s LFS, to je zahradní cesta vedoucí do nějakých tmavých lesů.
Začněte s distribucí, kde máte velkou kontrolu nad počáteční instalací, jako je Arch, nebo bezhlavou edicí, jako je server Ubuntu. Smyslem toho není ani tak úspora místa, jako spíše omezení složitosti konfigurace init; počínaje bezhlavým distrom, pokud aplikace, kterou chcete spustit, vyžaduje GUI, můžete přidat, co je k tomu potřeba, aniž byste museli skončit s přihlášením do GUI (aka. Display manager nebo DM) spuštěným init a plnohodnotnou pracovní plochou prostředí.
Pak se chcete naučit, jak nakonfigurovat systém init pro vaše účely – všimněte si, že bez init se neobejdete a může to být nejlepší způsob, jak dosáhnout vašeho cíle. Init systém používaný na většině linuxových distribucí je nyní systemd.
Jde o to minimalizovat to, co init dělá při bootování, a to je způsob, jak můžete vytvořit systém, který bude provozovat minimální množství softwaru pro podporu aplikace, na kterou se chcete zaměřit – takhle je v podstatě nastaven server, BTW, takže je to běžný úkol (všimněte si, že nemůžete mít doslova spuštěný "jen jeden" uživatelský proces, alespoň ne užitečné).
Pokud je aplikace, kterou chcete spustit, program s grafickým uživatelským rozhraním (dobrý příklad toho, proč nemůžete doslova spustit pouze jednu aplikaci, protože aplikace s grafickým rozhraním vyžadují X server), můžete mít ~/.xinitrc
to vypadá takto;
#!/bin/sh
myprogram
Když pak startx
, bude spuštěn pouze váš program a nebude možné měnit plochy nebo spouštět cokoli jiného, částečně proto, že zde není žádný správce oken ani pracovní prostředí (nebude zde tedy ani rámeček okna ani záhlaví).
pokud jste trochu v programování a chcete to vytvořit od nuly, můžete použít LFS, tj. Linux od nuly http://www.linuxfromscratch.org/
pokud chcete přizpůsobit ubutnu, můžete použít ubunt-builder a pokud jej chcete na bázi rpm, můžete použít SUsE-Studio, Suse studio vám umožní vytvořit vlastní suse linux
na zdraví