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