Загрузка данных
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"
'