Минимальная программа initrd CPIO hello world, шаг за шагом

Скомпилируйте привет мир без каких-либо зависимостей, который заканчивается бесконечным циклом. 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
Мы не можем использовать sys_exit, иначе ядро паникует.
Потом:
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"
Это создает файловую систему с нашим hello world at /init, которая является первой пользовательской программой, которую будет запускать ядро. Мы могли бы также добавить больше файлов, d/и они были бы доступны из /initпрограммы при запуске ядра.
Затем cdв дерево ядра Linux, сборка, как обычно, и запустить его в 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"
И вы должны увидеть строку:
FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR
на экране эмулятора! Обратите внимание, что это не последняя строка, поэтому вам нужно посмотреть немного дальше.
Вы также можете использовать программы на C, если статически связываете их:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
sleep(0xFFFFFFFF);
return 0;
}
с:
gcc -static init.c -o init
Вы можете работать на реальном оборудовании с включенным USB /dev/sdXи:
make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
Отличный источник на эту тему: http://landley.net/writing/rootfs-howto.html Также объясняется, как его использовать gen_initramfs_list.sh, это скрипт из дерева исходных текстов ядра Linux, помогающий автоматизировать процесс.
Следующий шаг: настройте BusyBox, чтобы вы могли взаимодействовать с системой: /unix/2692/what-is-the-smallest-possible-linux-implementation/203902#203902
Протестировано на Ubuntu 16.10, QEMU 2.6.1.