commit d56df0b3580991dd568e7abc2070bb67d184f440 Author: msh356 Date: Wed Jul 1 18:42:51 2026 +0300 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9265a08 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +**.o +**.iso diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7663fce --- /dev/null +++ b/Makefile @@ -0,0 +1,57 @@ +NASM = nasm +GCC = gcc +LD = ld +GRUB_RESCUE = grub-mkrescue + +# Исходники +BOOT_SRC = boot/boot.asm +KERNEL_SRCS = kernel/kmain.c +DRIVER_SRCS = drivers/vga.c + +# Автоматически собираем список всех объектных файлов +BOOT_OBJ = boot/boot.o +OBJS = kernel/kmain.o drivers/vga.o + +ISO_DIR = iso +KERNEL_BIN = $(ISO_DIR)/boot/kernel.bin +ISO_OUT = peredOS.iso + +NASM_FLAGS = -f elf32 +GCC_FLAGS = -m32 -ffreestanding -O2 -Wall -Wextra -c +LD_FLAGS = -m elf_i386 -T linker.ld +GRUB_FLAGS = + +all: $(ISO_OUT) + +# Сборка ISO +$(ISO_OUT): $(KERNEL_BIN) + @echo "[+] Крафтим ISO..." + $(GRUB_RESCUE) $(GRUB_FLAGS) -o $(ISO_OUT) $(ISO_DIR) + +# Линковка ядра +$(KERNEL_BIN): $(BOOT_OBJ) $(OBJS) + @echo "[+] Линкуем ядро..." + @mkdir -p $(ISO_DIR)/boot + $(LD) $(LD_FLAGS) $(BOOT_OBJ) $(OBJS) -o $(KERNEL_BIN) + +# Компиляция ассемблера +$(BOOT_OBJ): $(BOOT_SRC) + $(NASM) $(NASM_FLAGS) $(BOOT_SRC) -o $(BOOT_OBJ) + +# Универсальное правило для компиляции Си-файлов в kernel/ +kernel/%.o: kernel/%.c + @echo "[+] Компилируем ядро: $<" + $(GCC) $(GCC_FLAGS) $< -o $@ + +# Универсальное правило для компиляции Си-файлов в drivers/ +drivers/%.o: drivers/%.c + @echo "[+] Компилируем драйвер: $<" + $(GCC) $(GCC_FLAGS) $< -o $@ + +run: all + qemu-system-i386 -cdrom $(ISO_OUT) + +clean: + rm -f boot/*.o kernel/*.o drivers/*.o $(KERNEL_BIN) $(ISO_OUT) + +.PHONY: all run clean diff --git a/README.md b/README.md new file mode 100644 index 0000000..ce5b631 --- /dev/null +++ b/README.md @@ -0,0 +1,92 @@ +# peredOS + +Самая халяльная ОС которая существует впринципе + +# Роадмап + +## 1. Базовое + +- [x] Оно работает +- [x] Драйвер VGA +- [ ] Прерывания (GDT/IDT) +- [ ] Драйвер таймера +- [ ] Драйвер клавиатуры +- [ ] Нормальный драйвер VGA (скролл итд) +- [ ] Нормальный драйвер клавиатуры (Caps Lock, Shift, Numpad итд) +- [ ] Драйвер PC Speaker +- [ ] Screen buffers (как tty в Linux) +- [ ] ANSI Escape в screen buffers +- [ ] Драйвер мыши +- [ ] **VFS** +- [ ] DebugFS +- [ ] Драйвер cpio ramdisk +- [ ] Парсер MBR +- [ ] **Драйвер диска (ATA PIO)** +- [ ] **Драйвер FAT32** + +## 2. Процессы, память, user mode + +- [ ] Физ. менеджер памяти +- [ ] Вирт. менеджер памяти +- [ ] Куча ядра +- [ ] Потоки ядра +- [ ] **Планировщик** +- [ ] Синхронизация (mutex) +- [ ] Условные переменные +- [ ] Базовый IPC +- [ ] Пользовательские сегменты в GDT +- [ ] Таблица TSS +- [ ] Разделение памяти +- [ ] Прыжок в Ring 3 +- [ ] **Системные вызовы** +- [ ] Аллокатор пользовательского стека +- [ ] **Исполняемые файлы ELF** + +## 3. Экосистема, программы, libc + +- [ ] **POSIX-совместимый libc** +- [ ] **coreutils** +- [ ] **Порт простейшего (или нет) компилятора C** + +## 4. Драйвера (на десерт) + +- [ ] **Сканер PCI** +- [ ] **Сопоставление PCI-устройств с драйверами** +- [ ] Драйвер Realtek RTL8139 +- [ ] Драйвер Intel AC97 +- [ ] Драйвер BGA +- [ ] **Парсинг ACPI** + +## 5. Сеть + +- [ ] Парсер Ethernet-кадров +- [ ] Протокол ARP +- [ ] **Протокол IPv4** +- [ ] **Протокол ICMP** (ping) +- [ ] UDP +- [ ] **Базовый TCP** +- [ ] **Обкатка сетевых функций в libc** + +## 6. Далекое будущее + +Не факт, что вообще что-то из этого сбудется. + +- [ ] x64 +- [ ] EFI +- [ ] Работа с efivars +- [ ] UEFI ACPI +- [ ] USB +- [ ] SMP +- [ ] Драйвер extX +- [ ] Парсер GPT + +# Роадмап userland + +## 1. coreutils + +- [ ] Текстовые утилиты +- [ ] Файловые утилиты +- [ ] Информационные утилиты +- [ ] Утилиты администрирования +- [ ] Сетевые утилиты +- [ ] Отладочные утилиты diff --git a/boot/boot.asm b/boot/boot.asm new file mode 100644 index 0000000..546d69f --- /dev/null +++ b/boot/boot.asm @@ -0,0 +1,23 @@ +; Настройки Multiboot +MULTIBOOT_MAGIC equ 0x1BADB002 +MULTIBOOT_FLAGS equ 0x00 +MULTIBOOT_CHECKSUM equ -(MULTIBOOT_MAGIC + MULTIBOOT_FLAGS) + +section .multiboot +align 4 + dd MULTIBOOT_MAGIC + dd MULTIBOOT_FLAGS + dd MULTIBOOT_CHECKSUM + +section .text +global _start +extern kernel_main ; Наша функция из Си-файла + +_start: + mov esp, stack_space ; Выделяем указатель на стек + call kernel_main ; Прыгаем в Си! + jmp $ ; Если Си-функция вернется — виснем в вечном цикле + +section .bss +resb 8192 ; 8 КБ под стек +stack_space: diff --git a/drivers/vga.c b/drivers/vga.c new file mode 100644 index 0000000..97e6a22 --- /dev/null +++ b/drivers/vga.c @@ -0,0 +1,59 @@ +#include "vga.h" + +#define VGA_WIDTH 80 +#define VGA_HEIGHT 25 +#define VGA_ADDRESS 0xB8000 + +static volatile char *video_mem = (volatile char*)VGA_ADDRESS; +static int cursor_x = 0; +static int cursor_y = 0; +static char current_color = 0x07; // По умолчанию серый на черном + +void vga_init(void) { + cursor_x = 0; + cursor_y = 0; + // Заполняем весь экран пробелами + for (int i = 0; i < VGA_WIDTH * VGA_HEIGHT; i++) { + video_mem[i * 2] = ' '; + video_mem[i * 2 + 1] = current_color; + } +} + +void vga_set_color(char fg, char bg) { + current_color = (bg << 4) | (fg & 0x0F); +} + +void vga_putchar(char c) { + // Обработка переноса строки + if (c == '\n') { + cursor_x = 0; + cursor_y++; + } else { + int index = (cursor_y * VGA_WIDTH + cursor_x) * 2; + video_mem[index] = c; + video_mem[index + 1] = current_color; + cursor_x++; + } + + // Если вышли за правый край — перенос + if (cursor_x >= VGA_WIDTH) { + cursor_x = 0; + cursor_y++; + } + + // Если экран кончился — просто сбрасываем наверх (примитивный скролл) + if (cursor_y >= VGA_HEIGHT) { + vga_init(); + } +} + +void vga_print(const char *str) { + for (int i = 0; str[i] != '\0'; i++) { + vga_putchar(str[i]); + } +} + +void vga_println(const char *str) { + vga_print(str); + vga_putchar('\n'); +} diff --git a/drivers/vga.h b/drivers/vga.h new file mode 100644 index 0000000..c3a8756 --- /dev/null +++ b/drivers/vga.h @@ -0,0 +1,28 @@ +#ifndef VGA_H +#define VGA_H + +// Халяльная палитра цветов VGA текстового режима +#define VGA_COLOR_BLACK 0x0 +#define VGA_COLOR_GREEN 0x2 +#define VGA_COLOR_RED 0x4 +#define VGA_COLOR_LIGHT_GRAY 0x7 +#define VGA_COLOR_LIGHT_GREEN 0xA +#define VGA_COLOR_LIGHT_RED 0xC +#define VGA_COLOR_WHITE 0xF + +// Инициализация драйвера и очистка экрана +void vga_init(void); + +// Установка текущего цвета для последующего вывода +void vga_set_color(char fg, char bg); + +// Вывод одной буквы в текущую позицию курсора +void vga_putchar(char c); + +// Вывод полноценной строки +void vga_print(const char *str); + +// Вывод строки с автоматическим переносом на новую линию +void vga_println(const char *str); + +#endif diff --git a/iso/boot/grub/grub.cfg b/iso/boot/grub/grub.cfg new file mode 100644 index 0000000..31da243 --- /dev/null +++ b/iso/boot/grub/grub.cfg @@ -0,0 +1,18 @@ +# Настраиваем русский язык для GRUB +set lang=ru_RU + +# Включаем халяльный текстовый режим без лишнего графического блоата +set gfxmode=text +terminal_output console + +# Время ожидания до автозапуска (в секундах) +set timeout=5 + +menuentry "PeredOS" { + multiboot /boot/kernel.bin + boot +} + +menuentry "Reboot" { + reboot +} diff --git a/kernel/kmain.c b/kernel/kmain.c new file mode 100644 index 0000000..0a8cc0c --- /dev/null +++ b/kernel/kmain.c @@ -0,0 +1,9 @@ +#include "../drivers/vga.h" + +void kernel_main(void) { + vga_init(); + vga_set_color(VGA_COLOR_WHITE, VGA_COLOR_LIGHT_GREEN); + vga_println("--- BOOT PEREDOS ---"); + vga_println("---END BOOT PEREDOS---"); + while (1); +} diff --git a/linker.ld b/linker.ld new file mode 100644 index 0000000..8c3c4d9 --- /dev/null +++ b/linker.ld @@ -0,0 +1,33 @@ +ENTRY(_start) + +SECTIONS +{ + /* Начинаем загрузку с 1 Мегабайта (стандарт для ядер) */ + . = 1M; + + /* Секция кода */ + .text BLOCK(4K) : ALIGN(4K) + { + *(.multiboot) /* Заголовок для GRUB — строго на самом старте */ + *(.text) + } + + /* Секция данных только для чтения (строки, константы) */ + .rodata BLOCK(4K) : ALIGN(4K) + { + *(.rodata) + } + + /* Секция инициализированных глобальных переменных */ + .data BLOCK(4K) : ALIGN(4K) + { + *(.data) + } + + /* Секция неинициализированных переменных и стек */ + .bss BLOCK(4K) : ALIGN(4K) + { + *(COMMON) + *(.bss) + } +}