Как создать ядро 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
Оригинал