initial commit
This commit is contained in:
commit
d56df0b358
9 changed files with 321 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
**.o
|
||||||
|
**.iso
|
||||||
57
Makefile
Normal file
57
Makefile
Normal 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
92
README.md
Normal 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
23
boot/boot.asm
Normal 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
59
drivers/vga.c
Normal 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
28
drivers/vga.h
Normal 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
18
iso/boot/grub/grub.cfg
Normal 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
9
kernel/kmain.c
Normal 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
33
linker.ld
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue