Minimales Start-CPIO-Hallo-Welt-Programm Schritt für Schritt

Kompilieren Sie eine Hallo-Welt ohne Abhängigkeiten, die in einer Endlosschleife endet. 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
Wir können nicht verwenden sys_exit, sonst die Kernel-Panik.
Dann:
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"
Dadurch wird ein Dateisystem mit unserer Hallo-Welt erstellt /init, das das erste Userland-Programm ist, das der Kernel ausführen wird. Wir hätten auch weitere Dateien hinzufügen können, auf d/die über das /initProgramm zugegriffen werden kann, wenn der Kernel ausgeführt wird.
Dann cdin den Linux - Kernel - Baum, Build ist wie üblich, und führen Sie es in 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"
Und Sie sollten eine Linie sehen:
FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR
auf dem Emulatorbildschirm! Beachten Sie, dass dies nicht die letzte Zeile ist. Sie müssen also etwas weiter nach oben schauen.
Sie können C-Programme auch verwenden, wenn Sie sie statisch verknüpfen:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
sleep(0xFFFFFFFF);
return 0;
}
mit:
gcc -static init.c -o init
Sie können auf echter Hardware mit einem USB-Anschluss ausgeführt werden /dev/sdXund:
make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
Hervorragende Quelle zu diesem Thema: http://landley.net/writing/rootfs-howto.html Außerdem wird die Verwendung gen_initramfs_list.sheines Skripts aus dem Linux-Kernel-Quellbaum zur Automatisierung des Prozesses erläutert .
Nächster Schritt: Richten Sie BusyBox ein, damit Sie mit dem System interagieren können: /unix/2692/what-is-the-smallest-possible-linux-implementation/203902#203902
Getestet unter Ubuntu 16.10, QEMU 2.6.1.