Минимальная программа инициализации hello world, шаг за шагом
Скомпилируйте 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
Мы не можем использовать системный вызов exit, иначе произойдет паника ядра.
Затем:
mkdir d
as --64 -o init.o init.S # assemble
ld -o d/init init.o # link
cd d
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
ROOTFS_PATH="$(pwd)/../rootfs.cpio.gz"
Это создает файловую систему с нашим миром приветствия по адресу / 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
#include
int main() {
printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
sleep(0xFFFFFFFF);
return 0;
}
с:
gcc -static init.c -o init
Для динамической компоновки потребуется установка исполняемого файла динамического компоновщика, наиболее распространенные из которых являются частью стандартных библиотек C, таких как glibc.
Вы можете работать на реальном оборудовании с USB на / dev / sdX
и:
make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
Отличный источник по этой теме: Технический совет: Как использовать initramfs | landley.net Здесь также объясняется, как использовать gen_initramfs_list.sh
, который представляет собой сценарий из дерева исходных текстов ядра Linux, помогающий автоматизировать процесс.
Проверено на Ubuntu 16.10, QEMU 2.6.1.
Следующие шаги
Следующее, что вам нужно сделать, это настроить BusyBox .
BusyBox реализует базовые утилиты POSIX-y CLI, включая оболочку POSIX-y, которая позволяет вам более легко экспериментировать с системой в интерактивном режиме.
Лично я предпочитаю полагаться только на Buildroot , потрясающий набор скриптов, который автоматизирует сборку всего из исходных текстов и создание корневой файловой системы.
Я загрузил для этого очень подробный и автоматизированный помощник по адресу: https://github.com/cirosantilli/linux-kernel-module-cheat
Para una compilación de 32 -bits(i386
)en una compilación de 64 -bits(amd64
)en Debian 6, no debería necesitar multi -arch; si instala gcc-multilib
og++-multilib
(según su objetivo )y compila congcc -m32
(o g++ -m32
), debería obtener el resultado que busca.