Загрузка данных


bash -c 'set -e
mkdir -p "$HOME/XirexOS/src"
cd "$HOME/XirexOS"

cat > src/boot.asm <<'"'"'EOF'
BITS 64

section .multiboot
align 8

mb2_header:
    dd 0xE85250D6
    dd 0
    dd mb2_end - mb2_header
    dd -(0xE85250D6 + (mb2_end - mb2_header))
    dw 0
    dw 0
    dd 8

mb2_end:

section .text
global start
extern kmain

start:
    cli
    mov rsp, stack_top
    xor rdi, rdi
    call kmain

.hang:
    hlt
    jmp .hang

section .bss
align 16
stack_bottom:
    resb 16384
stack_top:
EOF

cat > src/linker.ld <<'EOF'
ENTRY(start)

SECTIONS
{
    . = 1M;

    .text : ALIGN(4K)
    {
        *(.multiboot)
        *(.text*)
    }

    .rodata : ALIGN(4K)
    {
        *(.rodata*)
    }

    .data : ALIGN(4K)
    {
        *(.data*)
    }

    .bss : ALIGN(4K)
    {
        *(COMMON)
        *(.bss*)
    }
}
EOF

cat > src/grub.cfg <<'EOF'
set timeout=0
set default=0

menuentry "Xirex OS" {
    multiboot2 /boot/kernel.bin
    boot
}
EOF

cat > src/kernel.c <<'EOF'
#include <stdint.h>

static volatile uint16_t* const VGA = (uint16_t*)0xB8000;

static void clear_screen(void)
{
    for (int i = 0; i < 80 * 25; i++)
        VGA[i] = ((uint16_t)0x07 << 8) | ' ';
}

static void put_char(int x, int y, char c, uint8_t color)
{
    VGA[y * 80 + x] = ((uint16_t)color << 8) | c;
}

static void print(int x, int y, const char* text, uint8_t color)
{
    while (*text)
    {
        put_char(x++, y, *text++, color);
    }
}

void kmain(void)
{
    clear_screen();

    print(28, 7,  "XIREX OS", 0x0F);
    print(20, 9,  "Modern OS is starting...", 0x07);
    print(25, 11, "Kernel loaded successfully", 0x0A);
    print(24, 13, "Architecture: x86_64", 0x07);
    print(22, 16, "Welcome to Xirex OS!", 0x0B);

    for (;;)
    {
        __asm__ volatile ("hlt");
    }
}
EOF

cat > Makefile <<'EOF'
BUILD=build
ISO=$(BUILD)/xirex-os.iso
KERNEL=$(BUILD)/kernel.bin

.PHONY: all clean run

all: $(ISO)

$(BUILD):
	mkdir -p $(BUILD)

$(BUILD)/boot.o: src/boot.asm | $(BUILD)
	nasm -f elf64 src/boot.asm -o $(BUILD)/boot.o

$(BUILD)/kernel.o: src/kernel.c | $(BUILD)
	gcc -m64 -ffreestanding -fno-stack-protector -fno-pie -mno-red-zone -nostdinc -c src/kernel.c -o $(BUILD)/kernel.o

$(KERNEL): $(BUILD)/boot.o $(BUILD)/kernel.o src/linker.ld
	ld -nostdlib -z max-page-size=0x1000 -T src/linker.ld $(BUILD)/boot.o $(BUILD)/kernel.o -o $(KERNEL)

$(ISO): $(KERNEL) src/grub.cfg
	mkdir -p $(BUILD)/isodir/boot/grub
	cp $(KERNEL) $(BUILD)/isodir/boot/kernel.bin
	cp src/grub.cfg $(BUILD)/isodir/boot/grub/grub.cfg
	grub-mkrescue -o $(ISO) $(BUILD)/isodir

run: $(ISO)
	qemu-system-x86_64 -cdrom $(ISO)

clean:
	rm -rf $(BUILD)
EOF

cat > README.md <<'EOF'
# Xirex OS

Xirex OS — экспериментальная операционная система.

Первый этап:
- x86_64
- собственный загрузчик
- собственное ядро
- GRUB/Multiboot2
- загрузочный ISO
- запуск в QEMU

Следующие этапы:
- framebuffer
- графический интерфейс
- окна
- мышь
- клавиатура
- файловая система
- сеть
- пользователи
- приложения
- собственный пакетный менеджер
EOF

echo
echo "======================================"
echo "        Xirex OS project created!"
echo "======================================"
echo

make

echo
echo "======================================"
echo " ISO READY:"
echo "$HOME/XirexOS/build/xirex-os.iso"
echo "======================================"
echo
echo "Для запуска в QEMU:"
echo "cd \"$HOME/XirexOS\" && make run"
'