Как создать ядро ​​Linux с помощью Nasm, Go Binary, Mini Linux

Как создать ядро ​​Linux с помощью Nasm, Go Binary, Mini Linux

23 апреля 2022 г.

Ссылка на Github для проекта: https://github.com/creotiv/howto-bootable-golang-binary


Предустановить


Некоторые вещи, необходимые для создания и запуска вещей


apt-get install bison flex nasm qemu-system-x86_64 libelf-dev bc


Nasm простой пример


Стандартный загрузочный сектор имеет размер 512 байт, который должен заканчиваться на 0xaa55 байт. Я создал простой скрипт Nasm, который печатает «Hello Wolrd!» при загрузке.


[орг 0x7c00]


мов ах, 0x0e


мов бх, привет


Распечатать:


мов ал, [bx]


смп ал, 0


конец


интервал 0x10


вкл бх


jmp печать


конец:


jmp $


привет:


дб 'Привет, мир!', 0


раз 510-($-$$) дб 0


дв 0xaa55 ; эти байты должны заканчиваться загрузочным сектором


Скомпилируйте загрузочный двоичный файл:


nasm -f bin boot.nasm -o boot.bin


Запустите его с помощью эмулятора


qemu-system-x86_64 boot.bin


Запустите двоичный файл go в ядре Linux


Во-первых, нам нужно загрузить последнюю стабильную версию ядра Linux.


curl https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.17.4.tar.xz | смола Jx


Затем нам нужно настроить его и выбрать все, что нам нужно. Это довольно сложно, потому что есть куча настроек. Я сделал некоторую конфигурацию по умолчанию в root/.config, которую вы можете скопировать в папку linux-5.17.4 для использования.


Если вы хотите создать свою собственную конфигурацию, используйте: make menuconfig


Скомпилируйте ядро ​​(это займет некоторое время)


cd linux-5.17.4 && сделать -j4


Теперь давайте запустим образ с нашим ядром, чтобы посмотреть, работает ли он.


qemu-system-x86_64-serial stdio-kernel linux-5.17.4/arch/x86/boot/bzImage


Мы получили ошибку о том, что мы не смонтировали диск  — все в порядке, потому что мы действительно этого не делали.


Теперь нам нужно смонтировать диск и добавить на него наш бинарник, библиотеки и т.д. Для этого мы будем использовать initramfs, в основном помещая все в оперативную память.


Для этого нам нужно собрать наш двоичный файл go со статической привязкой и создать gzip-архив с нашим креплением на оперативную память (в основном только наш двоичный файл).


Очень простой скрипт:


```javascript


основной пакет


импорт (


"ФМТ"


основная функция () {


строка данных переменной


fmt.Println("Привет с вашего образа Go!")


за {


fmt.Println("Введите что-нибудь:")


fmt.Scanln(&данные)


fmt.Printf("Эхо: %s
", данные)


```javascript


!/бин/баш


SPATH=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )


cd $SPATH/гобинарный


go build -ldflags="-extldflags=-static" -o инициализация


компакт диск ../


mkdir -p горам


МВ $SPATH/gobinary/инит $SPATH/горам/инит


cd $SPATH/горам


найти . -print0 | cpio --null -ov --format=newc | gzip -9 > ../goram.cpio.gz


./build-ramfs.sh


Теперь мы можем запустить его, как и раньше, просто добавим крепление для оперативной памяти.


qemu-system-x86_64 -serial stdio -kernel linux-5.17.4/arch/x86/boot/bzImage -initrd go-ram.cpio.gz


Создание образа mini-linux


Конечно, мы можем создать свой собственный Linux. Например, мы можем использовать изображение Buxybox для этого


```javascript


завиток https://busybox.net/downloads/busybox-1.34.1.tar.bz2 | смола JZ


CD Busybox-1.33.2


сделать менюконфигурации


сделать -j4


сделать установку


компакт диск ..


Теперь давайте заполним наше изображение


```javascript


mkdir -p bbram/{bin,sbin,etc,proc,sys,usr/bin,usr/sbin}


cp -a busybox-1.34.1/_install/* bbram/


Давайте создадим приветственный скрипт инициализации


```javascript


!/бин/ш


/bin/mount -t devtmpfs devtmpfs /dev


/bin/mount -t proc нет /proc


/bin/mount -t sysfs нет /sys


dmesg -n 1


кошка << EOF


Загрузка заняла $(cut -d' ' -f1 /proc/uptime) секунд




| \/ () () | | (_)


| \ / | _ __ _ | | _ _ ___


| |\/| | | ' \| | | | | | ' \| | | \ \/ /


| | | | | | | | | | |____| | | | | |_| |> <


|| |||| ||| |_||| ||_,/_/_\


EOF


exec setsid cttyhack sh #https://busybox.net/FAQ.html#job_control


исполняемый файл /bin/sh


Сохрани это


```javascript


cp init bbram/bin/init


chmod +x bbram/bin/инит


Создать оперативный архив


```javascript


компакт-диск


найти . -print0 | cpio --null -ov --format=newc | gzip -9 > ../bbram.cpio.gz


компакт диск ../


Запустить его


qemu-system-x86_64 -kernel linux-5.17.4/arch/x86/boot/bzImage -initrd bbram.cpio.gz -m1024



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE