Minimal initrd CPIO merhaba dünya programı adım adım

Sonsuz bir döngü ile biten herhangi bir bağımlılık olmadan merhaba bir dünya derleyin. 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Çekirdek panikleri kullanamayız .
Sonra:
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"
Bu /init, çekirdeğin çalışacağı ilk kullanıcı alanı programı olan merhaba dünyamızla bir dosya sistemi oluşturur . Ayrıca daha fazla dosya ekleyebilirdik d/ve /initçekirdek çalıştığında bunlara programdan erişilebilir .
Sonra cdLinux çekirdek ağacına, yapı her zamanki gibi ve QEMU'da çalıştırın:
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"
Ve bir çizgi görmelisiniz:
FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR
emülatör ekranında! Son satır olmadığını unutmayın, bu yüzden biraz daha yukarı bakmanız gerekir.
Statik olarak bağlarsanız C programlarını da kullanabilirsiniz:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
sleep(0xFFFFFFFF);
return 0;
}
ile:
gcc -static init.c -o init
USB açıkken gerçek donanımda çalıştırabilirsiniz /dev/sdXve:
make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
Bu konuda harika bir kaynak: http://landley.net/writing/rootfs-howto.html Ayrıca gen_initramfs_list.sh, işlemin otomatikleştirilmesine yardımcı olmak için Linux çekirdek kaynak ağacından bir komut dosyası olan nasıl kullanılacağını da açıklar .
Sonraki adım: BusyBox'ı sistemle etkileşime girecek şekilde ayarlayın: /unix/2692/what-is-the-smallest-possible-linux-implementation/203902#203902
Ubuntu 16.10, QEMU 2.6.1 üzerinde test edilmiştir.