initial commit

This commit is contained in:
msh356 2026-07-01 18:42:51 +03:00
commit d56df0b358
9 changed files with 321 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
**.o
**.iso

57
Makefile Normal file
View file

@ -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

92
README.md Normal file
View file

@ -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
- [ ] Текстовые утилиты
- [ ] Файловые утилиты
- [ ] Информационные утилиты
- [ ] Утилиты администрирования
- [ ] Сетевые утилиты
- [ ] Отладочные утилиты

23
boot/boot.asm Normal file
View file

@ -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:

59
drivers/vga.c Normal file
View file

@ -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');
}

28
drivers/vga.h Normal file
View file

@ -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

18
iso/boot/grub/grub.cfg Normal file
View file

@ -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
}

9
kernel/kmain.c Normal file
View file

@ -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);
}

33
linker.ld Normal file
View file

@ -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)
}
}