Jednoduchý operačný systém v C

Funkcie biosu sú síce pekné, ale v reáli ich nemôžeme využiť lebo musíme pracovať v chránenom móde kde nefungujú. V tomto návode sa naučíte ako napíšete čokoľvek na obrazovku v chránenom móde.

Klaykap


Textový mód

Celé písanie na obrazovku funguje tak že grafická karta stále skenuje nejakú časť pamäte a podľa toho čo je v nej píše na obrazovku. Emulátory robia že po naštartovaní je systém v textovom móde s 80 stĺpcami a 25 riadkami. Textový mód znamená že grafická karta podľa predvoleného fontu bude písať na obrazovku. V textovom móde sa skenuje pamäť od 0xB8000 až do 0xBFFFF. Každé okienko na obrazovke má dva bajty. V prvom bajte je ASCII kód znaku a v druhom bajte je farba. V jeho hornej časti(0x?) sa určuje farba písma a v dolnej časti(0x0?) farba pozadia písma. Teraz už vieme všetko čo potrebujeme na napísanie metódy písania na obrazovku.

void printf(char *message, unsigned int line, unsigned int column, unsigned int colour) // the message and then the line #
{
	char *vidmem = (char *) 0xB8000;
	unsigned int i=0;

	i=((line*80*2)+(column*2));   //start of line

	while(*message!=0)
	{
		vidmem[i]=*message;
		*message++;
		i++;
		vidmem[i]=colour; //colour of text
		i++;
	}

}
    

Tu sú farby:

Metódu využívame printf("Toto je moj novy operacny system!", 0, 0, 0x0F); čo napíše biely text na čiernom pozadí.


Kompilácia

Nuž ale na to aby nám kód fungoval ho najprv musíme skompilovať. Ako prvé si vytvoríme súbor v assembleri kernel.asm:

%define MULTIBOOT_MAGIC 0x1BADB002
%define MULTIBOOT_FLAGS 0x00000007
%define VIDEO_USE_TEXT  1 ; 0 for graphics mode, 1 for text mode
%define VIDEO_WIDTH     80 ; width (pixels for graphics and characters for text mode)
%define VIDEO_HEIGHT    25 ; height
%define VIDEO_BPP       32 ; bpp (ignored for text mode)

[bits 32]

segment .text
global multiboot_header
align 4 ; multiboot header must be 4 bytes aligned and be contained in first 8k of the image file
multiboot_header:
  dd MULTIBOOT_MAGIC ; magic
  dd MULTIBOOT_FLAGS ; flags
  dd -(MULTIBOOT_MAGIC + MULTIBOOT_FLAGS) ; checksum
  dd 0, 0, 0, 0, 0 ; header_addr, load_addr, load_end_addr, bss_end_addr, entry_addr (all 0 for i386 ELF images)
  dd VIDEO_USE_TEXT, VIDEO_WIDTH, VIDEO_HEIGHT, VIDEO_BPP ; mode_type, width, height, depth

global start
extern kmain

start:
  cli 			;block interrupts
  mov esp, stack_space	;set stack pointer
  call kmain
  jmp $		 	;halt the CPU

section .bss
resb 8192		;8KB for stack
stack_space:
    

Teraz si vytvoríme súbor kernel.c kde bude náš kernel aj s metódou printf():

void kmain(void) {
    printf("Toto je moj novy OS!", 0, 0, 0x0F);
}
    

A nakoniec súbor link.ld čo je linker ktorý tieto dva súbory spojí do jedného:

OUTPUT_FORMAT(elf32-i386)
ENTRY(start)
SECTIONS
 {
   . = 0x100000;
   .text : { *(.text) }
   .data : { *(.data) }
   .bss  : { *(.bss)  }
 }
    

Teraz si otvorte priečinok v termináli(pravé tlačidlo>otvoriť v termináli) a postupne napíšte:

    nasm -f elf32 kernel.asm -o kasm.o
    gcc -m32 -c -fno-stack-protector kernel.c -o kc.o
    ld -m elf_i386 -T link.ld -o kernel kasm.o kc.o
    

Vznikne vám súbor kernel ktorý teraz napcháme do GRUBu a spustíme ho vo Virtualboxe.


GRUB

Každý operačný systém potrebuje bootloader ktorý nahrá do pamäti kernel. Našťastie sa s písaním bootloaderu nemusíme trápiť lebo môžeme použiť bootloader GRUB. Používajú ho všetky operačné systémy postavené na linuxe a použijeme ho aj my.

Ako prvé treba vytvoriť priečinok iso. V priečinku iso si vytvorte priečinok boot a do priečinku boot si skopírujte súbor kernel. Okrem toho vytvorte v priečinku boot priečinok grub a v priečinku grub spravte súbor grub.cfg do ktrorého skopírujte tento text:

    menuentry "Moj operacny system" {
	    multiboot /boot/kernel
    }
    

Teraz choďte do priečinku v ktorom máte priečinok iso, otvorte ho v termináli a napíšte(musíte mať program grub-mkrescue):

    grub-mkrescue -o grub.iso iso
    

Týmto príkazom sa vytvorí súbor grub.iso ktorý môžete spustiť cez Virtualbox alebo iný emulátor alebo ho môžete dať na kľúč/cdčko a spustiť na reálnom počítači. Samozrejme na vlastnú zodpovednosť.


Virtualbox

Z emulátorov by som vám odporučil Virtualbox lebo má najlepšie grafické užívateľské rozhranie. Pridávanie nových systémov je jednoduché. Otvorte Virtualbox, stlačte Nový, napíšte meno svojho OSu, vybrte Other a Other/Unkown, ponechajte 64 MB ram pamäte a vytvorte VHD(Virtual Hard Disc) a veľkosť ako uvážite za vhodné(ale myslím si že 20 MB je dosť). Potom si svoj OS spustite a vyberte si grub.iso súbor a bude to fungovať! Hotovo!

os development vytvoril Klaykap
www.000webhost.com