Minimalny program initrd CPIO hello world krok po kroku

Skompiluj cześć świata bez żadnych zależności, które kończą się nieskończoną pętlą. 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
Nie możemy użyć sys_exit, inaczej jądro wpadnie w panikę.
Następnie:
mkdir d
as --64 -o init.o init.S
ld -o init d/init.o
cd d
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
ROOTFS_PATH="$(pwd)/../rootfs.cpio.gz"
Tworzy to system plików z naszym hello world /init, który jest pierwszym programem dla użytkowników, który uruchomi jądro. Moglibyśmy również dodać więcej plików d/i byłyby one dostępne z /initprogramu podczas działania jądra.
Następnie cdw drzewie jądra Linux, kompilacja jest jak zwykle i uruchom ją w 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"
I powinieneś zobaczyć linię:
FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR
na ekranie emulatora! Pamiętaj, że nie jest to ostatni wiersz, więc musisz spojrzeć nieco dalej.
Możesz także użyć programów C, jeśli połączysz je statycznie:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
sleep(0xFFFFFFFF);
return 0;
}
z:
gcc -static init.c -o init
Możesz działać na prawdziwym sprzęcie z włączonym USB /dev/sdXi:
make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
Świetne źródło na ten temat: http://landley.net/writing/rootfs-howto.html Wyjaśnia także, jak używać gen_initramfs_list.sh, czyli skryptu z drzewa źródeł jądra Linux, który pomaga zautomatyzować proces.
Następny krok: skonfiguruj BusyBox, aby móc współpracować z systemem: /unix/2692/what-is-the-smallest-possible-linux-implementation/203902#203902
Testowane na Ubuntu 16.10, QEMU 2.6.1.