🔧 AI Nachrichten Major AI platforms go down in unprecedented simultaneous outage(03.09.2026 um 17:34 Uhr)
🔧 AI Nachrichten ChatGPT, Claude, and Grok Down? Users Report Widespread Outages(03.09.2026 um 19:14 Uhr)
🔧 AI Nachrichten OpenAI Launches GPT-6 Astra, Says We May Have Entered the AGI Era(03.09.2026 um 22:08 Uhr)
🔧 AI Nachrichten Claude Comes to CarPlay as Fifth Major AI Chatbot App(05.09.2026 um 05:31 Uhr)
🔧 AI Nachrichten OpenAI’s GPT-6 Astra Is AGI, Says NVIDIA CEO Jensen Huang(07.09.2026 um 06:31 Uhr)
🔧 AI Nachrichten Blame AI companies for Mac mini and Mac Studio shortage(31.08.2026 um 10:32 Uhr)
🔧 AI Nachrichten Major AI platforms go down in unprecedented simultaneous outage(03.09.2026 um 17:34 Uhr)
🔧 AI Nachrichten ChatGPT, Claude, and Grok Down? Users Report Widespread Outages(03.09.2026 um 19:14 Uhr)
🔧 AI Nachrichten OpenAI Launches GPT-6 Astra, Says We May Have Entered the AGI Era(03.09.2026 um 22:08 Uhr)
🔧 AI Nachrichten Claude Comes to CarPlay as Fifth Major AI Chatbot App(05.09.2026 um 05:31 Uhr)
🔧 AI Nachrichten OpenAI’s GPT-6 Astra Is AGI, Says NVIDIA CEO Jensen Huang(07.09.2026 um 06:31 Uhr)
🔧 AI Nachrichten Blame AI companies for Mac mini and Mac Studio shortage(31.08.2026 um 10:32 Uhr)

🔧 Programmierung 🕛 kürzlich 9 Min Lesezeit
0

Building a chikku OS

↗ Quelle (dev.to)
🗣️ Stimme:
📑 Inhaltsübersicht




mintOS Developer Handbook






Table of Contents




  1. Boot Process

  2. Screen Driver

  3. Keyboard Driver

  4. Input System

  5. Kernel Library

  6. Parser & Shell






Tool Purpose






GCC Compiles C code

NASM Assembler

QEMU Emulator for testing OS

GRUB Bootloader

xorriso Creates bootable ISO





kernal.c





CODE
void kernel_main() {
char* video = (char*) 0xB8000;

const char* text = "Hello from mintOS";

for (int i = 0; text[i] != '\0'; i++) {
video[i * 2] = text[i];
video[i * 2 + 1] = 0x07;
}

while (1);
}





This C program displays text on the screen using VGA text mode.







VGA Video Memory



0xB8000 is a special memory address: the VGA text-mode video

memory
in older PCs.\

VGA uses a reserved area of RAM that the display hardware reads to

show text and graphics.



In VGA text mode, each character cell uses two bytes:




CODE
video[i * 2];
video[i * 2 + 1];






Here: - video[0] = 'H' places the character 'H' in the first

screen position
. - video[1] sets the color attribute for that

character.



Example:




CODE
1 byte = character
1 byte = color info
video[0] = 'H'; // character
video[1] = 0x07; // color












Configuration Files and GRUB



Create a .cfg file\

A .cfg file is a configuration file that contains settings or

instructions for a program.



GRUB (Grand Unified Bootloader) is a bootloader that: - Shows a boot

menu - Loads the kernel - Starts the operating system



In short, GRUB helps boot the OS.



GRUB = helper that knows where everything is stored



Without GRUB, you would manually tell the computer: - "Go to this disk

location." - "Read these sectors." - "Load this data into memory."



So GRUB saves you from doing that low-level work manually.




  • .cfg → instructions/settings a program reads\

  • .sh → shell script with commands the computer executes (starts
    programs, runs commands in the terminal)



Program start sequence:




CODE
Program starts

Reads .cfg file

Uses those settings/instructions












Boot Process: BIOS/UEFI → GRUB → OS



BIOS/UEFI is firmware built into the motherboard. Every time you

turn on a computer:




  1. BIOS/UEFI firmware runs automatically.

  2. It starts the bootloader.

  3. The bootloader starts the operating system.



Basic boot flow:




CODE
Power On
→ BIOS/UEFI
→ GRUB starts
→ GRUB reads grub.cfg
→ GRUB loads the OS
→ OS starts












boot.asm -- Multiboot Entry Point



Create boot.asm:




CODE
section .multiboot
align 4
dd 0x1BADB002
dd 0x00
dd -(0x1BADB002 + 0x00)

section .text
global _start
extern kernel_main

_start:
call kernel_main

hang:
jmp hang






boot.asm is the initial startup code that helps GRUB start

your kernel
.\

It: - Tells GRUB this is a valid multiboot kernel - Calls

kernel_main() (from kernal.c) after the kernel is loaded into

RAM



dd 0x1BADB002 is a special magic number used by GNU GRUB.\

A magic number is a fixed value used to identify a file format or

type.



Boot code: → runs directly on hardware before any OS exists\

Normal software: → runs on top of the operating system



The magic number does not specify where to load the kernel. It

only identifies the file type to the bootloader.







Full Boot Flow So Far





CODE
Power On
→ BIOS/UEFI starts
→ GRUB starts
→ GRUB reads grub.cfg
→ GRUB loads kernel (using boot.asm + kernel.bin) into RAM
→ boot.asm starts
→ kernel_main() runs
→ Your OS runs









Tools and Concepts




  • GNU Compiler Collection (GCC)\

    Converts C/C++ code into machine code the computer can run.


  • Linker script\

    Defines how the final kernel binary is laid out in memory.


  • QEMU\

    An emulator/virtual machine that creates a virtual computer

    inside your real computer so you can run operating systems

    safely
    .\

    QEMU provides a virtual machine where this minimal OS runs.






Now you have created a basic mini OS that prints a static message.




CODE
├── Makefile
├── MintOS.iso
├── boot
│   └── boot.asm
├── boot.o
├── iso
│   └── boot
│   ├── grub
│   │   └── grub.cfg
│   └── kernel.bin
├── kernel
│   ├── kernel.c
│   ├── screen.c
│   └── screen.h
├── kernel.bin
├── kernel.o
├── linker.ld
└── screen.o






Makefile → instructions for building the OS automatically boot/boot.asm

→ startup assembly code for the kernel iso/ → folder used to create the

bootable ISO iso/boot/grub/grub.cfg → GNU GRUB boot configuration file

kernel/kernel.c → main kernel C code kernel/screen.c → screen display

functions kernel/screen.h → declarations for screen functions linker.ld

→ tells how to arrange the kernel in RAM




CODE
Makefile -----------------------------
all:
nasm -f elf32 boot/boot.asm -o boot.o
gcc -m32 -ffreestanding -c kernel/kernel.c -o kernel.o
gcc -m32 -ffreestanding -c kernel/screen.c -o screen.o

ld -m elf_i386 -T linker.ld -o kernel.bin boot.o kernel.o screen.o

cp kernel.bin iso/boot/kernel.bin

grub-mkrescue -o mintOS.iso iso

qemu-system-x86_64 -cdrom mintOS.iso

## boot.asm ----------------------------------

section .multiboot
align 4
dd 0x1BADB002
dd 0x00
dd -(0x1BADB002 + 0x00)

section .text
global _start
extern kernel_main

_start:
call kernel_main

hang:
jmp hang

grub.cfg -----------------------------------

menuentry "mintOS" {
multiboot /boot/kernel.bin
boot
}

kernel.c -------------------------------------------

#include "screen.h"

void kernel_main() {

clear_screen();

print("Welcome to MintOS!");

while (1);

screen.c -------------------------------------------------

#include "screen.h"

char* video = (char*) 0xB8000;
int cursor = 0;

void clear_screen() {
for (int i = 0; i < 80 * 25; i++) {
video[i * 2] = ' ';
video[i * 2 + 1] = 0x07;
}

cursor = 0;
}

void print(const char* str) {
int i = 0;

while (str[i] != '\0') {
video[cursor++] = str[i++];
video[cursor++] = 0x07;
}


screen.h --------------------------------------------------

#ifndef SCREEN_H
#define SCREEN_H

void print(const char* str);
void clear_screen();

#endif

linker.ld ------------------------------------------

ENTRY(_start)

SECTIONS
{
. = 1M;

.text :
{
*(.multiboot)
*(.text)
}

.rodata :
{
*(.rodata)
}

.data :
{
*(.data)
}

.bss :
{
*(.bss)
}
}









Phase 3 --- Keyboard Driver



Until now, mintOS could only display text. It could not receive

any input from the user.



The goal of this phase is to make the keyboard interactive.







How the Keyboard Works



A keyboard does not send characters like 'A' or 'B'.



Instead, it sends scan codes.



Key Scan Code





A 0x1E

B 0x30

C 0x2E

Enter 0x1C

Space 0x39

Backspace 0x0E



Example:




CODE
Press A

Keyboard sends
0x1E






The operating system converts the scan code into an ASCII character.




CODE
0x1E

'a'












Memory-Mapped vs Port-Mapped I/O



Previously, we wrote directly to VGA memory.




CODE
0xB8000






This is called Memory-Mapped I/O.



The keyboard is different.



It communicates through I/O Ports.




CODE
CPU

├── Memory
│ 0xB8000

└── I/O Ports
0x60







  • Memory-mapped I/O → Access hardware through memory addresses.

  • Port-mapped I/O → Access hardware through I/O ports.



The keyboard uses:




CODE
Port 0x60












Reading an I/O Port



The CPU provides a special instruction:




CODE
in






Since C cannot execute CPU instructions directly, we use inline

assembly
.



The helper function:




CODE
inb(0x60)






reads one byte from keyboard port 0x60.









New Files Added






CODE
kernel/
keyboard.c
keyboard.h
ports.h






Every hardware component gets its own driver.



Examples:




CODE
keyboard.c
timer.c
mouse.c
disk.c












Scancode Lookup Table



The keyboard driver contains a lookup table.




CODE
static const char scancode_table[128];






This converts scan codes into ASCII characters.



Example:



Scan Code Character






0x02 '1'

0x03 '2'

0x1E 'a'

0x30 'b'



The array index is the scan code.



Example:




CODE
scancode_table[0x1E]






returns




CODE
'a'












Keyboard Flow






CODE
Press Key

Keyboard

Port 0x60

inb(0x60)

Scan Code

Lookup Table

ASCII Character

kernel.c

Print on Screen












Continuous Polling



The kernel continuously checks for keyboard input.




CODE
while (1)

keyboard_get_char()

Print Character






This method is called Polling.



The kernel repeatedly asks:




CODE
Any key?

Any key?

Any key?












Key Press vs Key Release



Every key usually generates two scan codes.



Example:




CODE
Press A

0x1E

Release A

0x9E






Notice:




CODE
0x9E = 0x1E + 0x80






To detect a key release:




CODE
if (scancode & 0x80)






Meaning:




  • Result = 0 → Key Press

  • Result ≠ 0 → Key Release



This works because the highest bit (MSB) is set only for release

scan codes.







Current Limitation



Currently, the kernel continuously reads from port 0x60.



It does not first check whether the keyboard has produced a new

scan code.



Therefore, pressing a key once may repeatedly print the same character.



Example:




CODE
Press F

ffffffffffffffff...






The next improvement is to check the keyboard status port (0x64)

before reading from 0x60.







Summary




  • Keyboard sends scan codes, not characters.

  • Scan codes are read from I/O port 0x60.

  • inb() reads data from an I/O port.

  • A lookup table converts scan codes → ASCII.

  • The kernel continuously polls the keyboard.

  • Each key generates Press (Make Code) and Release (Break
    Code)
    scan codes.

  • The next step is to check port 0x64 to avoid reading the same
    scan code repeatedly.







Phase 4 --- Input System



Until now, the keyboard could only display characters on the screen.



The next step was to store everything the user types inside an input

buffer
so the shell can execute complete commands.





Input Flow





CODE
Keyboard

keyboard_get_char()

Input Buffer

Press Enter

shell_execute()







Input Buffer



The input buffer stores every character typed by the user.



Example:




CODE
help



h e l p \0






Functions added:




CODE
input_add_char()
input_backspace()
input_submit()
input_clear()
input_get_buffer()









Enter Key



When Enter is pressed:




CODE
Input Buffer

input_submit()

shell_execute()









Backspace



Backspace removes the last character from the input buffer.









Phase 5 --- Kernel Library



The kernel now has its own standard library.



Current structure:




CODE
kernel/
├── include/
│ ├── string.h
│ └── memory.h
└── lib/
├── string.c
└── memory.c






Functions implemented:




CODE
strlen()
strcmp()
strcpy()
strncpy()
strchr()

memcpy()
memset()
memcmp()






These functions will be reused by every subsystem in mintOS.









Phase 6 --- Parser & Shell



Until now, the shell compared the entire input string.



Example:




CODE
echo Hello World






This would never equal:




CODE
echo






So we introduced a parser.






Goal



Transform:




CODE
echo Hello World






into:




CODE
Command:
echo

Argument:
Hello World









Parser Flow






CODE
Input Buffer


Tokenizer


Parser


Commands









strchr()



The parser uses:




CODE
char *strchr(const char *str, char ch);






to find the first space.



Example:




CODE
echo Hello World
^






The space is replaced with:




CODE
'\0'






Memory changes from:




CODE
e c h o _ H e l l o \0






to:




CODE
e c h o \0 H e l l o \0






Now we have two strings:




CODE
command  -> "echo"
argument -> "Hello World"









ParsedCommand



The parser returns:




CODE
typedef struct
{
char *command;
char *argument;
} ParsedCommand;






Example:




CODE
ParsedCommand parsed = parse_command(input);









Shell Layout






CODE
shell/
├── shell.c
├── parser.c
├── parser.h
├── commands.c
└── commands.h






Responsibilities:




  • parser.c → Split the input.

  • shell.c → Execute commands.

  • commands.c → Implement each command.






Echo Command






CODE
> echo Hello World

Hello World






Implementation:




CODE
void cmd_echo(const char *text)
{
print(text);
print("\n");
}









Current mintOS Structure






CODE
kernel/
├── arch/
├── drivers/
├── include/
├── input/
├── lib/
└── shell/









Next Roadmap




  • Improve parser

  • Command table

  • GDT

  • IDT

  • Interrupts

  • Memory Manager

  • PIT Timer

Vollständiger Original-Bericht
Ausführliche Details, Code-Beispiele & Hersteller-Stellungnahme auf dev.to.
↗ Original-Artikel auf dev.to lesen
Wie bewertest du diesen Beitrag?
1 Klick Feedback
Teilen mit Netzwerk & Team:

Community-Analysen & Experten-Meinungen 0

Verfasse deine eigene Analyse, teile Workarounds oder diskutiere diesen Vorfall im Blog.
Noch keine Community-Analyse verfasst. Markiere einen Textabschnitt oder klicke oben auf Eigene Analyse verfassen“!
Community Pulse: Relevanz-Einschätzung
1 Klick Experten-Votum
🔴 Akute Relevanz 0%
🟡 In Evaluierung 0%
🟢 Keine Auswirkung 0%
Spannende Innovation 0%
Verwandte Story-Cluster & Quellen (Vektor-KI)
Port 8095 Engine
3 Quellen
GPT-6 Astra Release Today? OpenAI’s Next Major AI Model Is Almost Here
1 Quelle
Apple accuses OpenAI of destroying evidence as trade-secrets fight intensifies
1 Quelle
Major AI platforms go down in unprecedented simultaneous outage
Ähnliche Beiträge
🔍 Verwandte News

Auch interessante Nachrichten Building a chikku OS

Thematisch verwandte Begriffe: Building, chikku · 6 Treffer

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...