Tối thiểu CPIO xin chào chương trình thế giới từng bước

Biên dịch một thế giới xin chào mà không có bất kỳ sự phụ thuộc nào kết thúc trong một vòng lặp vô hạn. 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
Chúng tôi không thể sử dụng sys_exit
, hoặc nếu không thì sự hoảng loạn hạt nhân.
Sau đó:
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"
Điều này tạo ra một hệ thống tập tin với thế giới xin chào của chúng tôi /init
, đây là chương trình người dùng đầu tiên mà kernel sẽ chạy. Chúng tôi cũng có thể đã thêm nhiều tệp vào d/
và chúng có thể truy cập được từ /init
chương trình khi kernel chạy.
Sau đó cd
vào cây nhân Linux, xây dựng như bình thường và chạy nó trong 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"
Và bạn sẽ thấy một dòng:
FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR
trên màn hình giả lập! Lưu ý rằng nó không phải là dòng cuối cùng, vì vậy bạn phải nhìn xa hơn một chút.
Bạn cũng có thể sử dụng các chương trình C nếu bạn liên kết chúng tĩnh:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
sleep(0xFFFFFFFF);
return 0;
}
với:
gcc -static init.c -o init
Bạn có thể chạy trên phần cứng thực với bật USB /dev/sdX
và:
make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
Nguồn tuyệt vời về chủ đề này: http://landley.net/wr/rootfs-howto.html Nó cũng giải thích cách sử dụng gen_initramfs_list.sh
, đó là một tập lệnh từ cây nguồn Linux để giúp tự động hóa quy trình.
Bước tiếp theo: thiết lập BusyBox để bạn có thể tương tác với hệ thống: /unix/2692/what-is-the-smallest-possible-linux-im THỰCation / 203902#203902
Đã thử nghiệm trên Ubuntu 16.10, QEMU 2.6.1.