From 98b79d7fcfc54c330a292977aa74bece66f67e40 Mon Sep 17 00:00:00 2001 From: xamidev Date: Tue, 6 Aug 2024 15:29:13 +0200 Subject: [PATCH] Add: brainfuck interpreter; documentation; uptime --- README.md | 39 +++++++++++++++++++++++----- USERS.md | 39 ++++++++++++++++++++++++++-- iso/boot/kernel.elf | Bin 30992 -> 31112 bytes src/drivers/kb.h | 6 +++++ src/drivers/timer.c | 5 ++++ src/kernel/shell.c | 10 +++++++- src/kernel/system.h | 1 + src/programs/bf.c | 55 ++++++++++++++++++++++++++++++++++++++++ src/programs/misc.c | 8 ++++++ src/programs/programs.h | 3 +++ 10 files changed, 156 insertions(+), 10 deletions(-) create mode 100644 src/drivers/kb.h create mode 100644 src/programs/bf.c diff --git a/README.md b/README.md index 0fa4573..14961a1 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,19 @@ # BlankOS -Rewritten monolithic version of Blank OS for the x86 processor architecture. Features a framebuffer, serial port driver, GDT, IDT. The OS relies on an old, legacy version of GRUB as the bootloader (eltorito). This *should* be GRUB 2 compatible. Emulation was tested on Arch Linux 6.9.7-arch1-1. The long-term goal of this OS is to be capable of running user programs and having its own complete kernel C library so that users can write their own C programs and expand the system! +Rewritten monolithic version of Blank OS for the x86 processor architecture. The OS relies on an old, legacy version of GRUB as the bootloader (eltorito). This *should* be GRUB 2 compatible. Emulation was tested on Bochs and QEMU using Arch Linux 6.9.7-arch1-1, and on real hardware too. +The long-term goal of this OS is to be capable of running user programs and having its own complete kernel C library so that users can write their own C programs and expand the system! -Next steps for this project will be: -- User programs -- Completing the kernel libc -- Filesystem support +## Features + +- Serial port driver (output & debug) +- Framebuffer driver (output) +- PS/2 Keyboard and PIC driver (input) +- PIT (system clock/timer) driver +- Working IDT, GDT, ISRs, and IRQs +- Kernel panicking (exception handling) +- A kernel-space shell +- Cool color output!! +- Some small working kernel-space programs!! ## Usage @@ -51,9 +59,26 @@ sudo dd bs=4M if=blankos.iso of=/dev/sdX status=progress oflag=sync Replace `sdX` with your USB drive name (you can find it by doing `sudo fdisk -l`). Tada! You now have a working BlankOS USB stick. Go ahead and try it out! -## Post-install guides +## Post-install -Two documents are available to help you understand the project better. One is the User's Manual, labelled `USERS.md`, and the other one is the Developer's Manual, labelled `DEVELOPERS.md`. They are full of useful resources around Blank OS. +Two documents are available to help you understand the project better. One is the User's Manual, labelled `USERS.md`, and the other one is the Developer's Manual, labelled `DEVELOPERS.md`. They are full of useful resources around Blank OS. You'll learn how to use the system and how to contribute to it. + +### Next Steps? + +Next steps for this project will be: + +- User programs +- Completing the kernel libc +- Filesystem support + +### Resources + +- the [OSDev.org](https://wiki.osdev.org/Expanded_Main_Page) wiki and forums +- the [Nanobyte](https://www.youtube.com/watch?v=9t-SPC7Tczc&list=PLFjM7v6KGMpiH2G-kT781ByCNC_0pKpPN) YouTube channel +- the [Daedalus Community](https://www.youtube.com/@DaedalusCommunity) YouTube channel +- a great book named *Operating Systems: From 0 to 1*, by Tu, Do Hoang +- the Intel [64 and IA-32 Architectures Software Developer Manuals](https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html) +- [Bran's Kernel Development Tutorial](http://www.osdever.net/bkerndev/index.php) ### ⚠️ Disclaimer diff --git a/USERS.md b/USERS.md index bf15b39..45e19df 100644 --- a/USERS.md +++ b/USERS.md @@ -12,6 +12,41 @@ Once you have launched the OS for the first time, you should first see the welco To get the list of available commands on the system, type `help`. -## Next what? +### Commands -Once programs will be added, there will be more info here. For now you can just play around and make the kernel panic. That's it. +#### `help` + +Shows all of the available commands, which are explained here. + +#### `panic` + +Triggers a kernel panic by trying to divide four by zero. + +#### `words` + +Prints ten random words using an arbitrary dictionary that you can expand in `src/programs/words.c`. + +#### `primes` + +Computes prime numbers up to `PRIMES_MAX`, defined in `src/programs/primes.c`. + +#### `rainbow` + +Asks for text and then outputs it with different vibrant colors. + +#### `clear` + +Clears the screen by scrolling (screen height) times. + +#### `math` + +**This program is not working!** +The lexer and parser should be okay, but I can't figure out the `%f` floating point format specifier in the freestanding printf implementation; it triggers weird exceptions that I don't understand. So no math interpreter for now. + +#### `bf` + +A brainfuck interpreter with every instruction and default tape size (30k cells). + +#### `uptime` + +Gets system uptime from the timer in ticks. Ticks are incremented at a rate of 18.222Hz (18.222 ticks per second). diff --git a/iso/boot/kernel.elf b/iso/boot/kernel.elf index 7b70d9ef88d530ee5c357a86f3044264569425d8..51c05f1b61cdf3f335a9bffb5daa2a9d4cb30188 100755 GIT binary patch delta 9588 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 VlYjkqQp^+ca7^zsFtk&7{u}Jqg75$U delta 8603 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 diff --git a/src/drivers/kb.h b/src/drivers/kb.h new file mode 100644 index 0000000..f50cab5 --- /dev/null +++ b/src/drivers/kb.h @@ -0,0 +1,6 @@ +#ifndef KB_H +#define KB_H + +char keyboard_getchar(); + +#endif diff --git a/src/drivers/timer.c b/src/drivers/timer.c index d10744f..29520c0 100644 --- a/src/drivers/timer.c +++ b/src/drivers/timer.c @@ -19,3 +19,8 @@ void delay(int ticks) eticks = global_ticks + ticks; while (global_ticks < eticks); } + +int uptime() +{ + return global_ticks; +} diff --git a/src/kernel/shell.c b/src/kernel/shell.c index 6e1872e..815fe5a 100644 --- a/src/kernel/shell.c +++ b/src/kernel/shell.c @@ -21,7 +21,7 @@ void shell_install() } else if (strcmp(input_buffer, "help") == 0) { - printf("help\tpanic\twords\tprimes\trainbow\tclear\nmath\n"); + printf("help\tpanic\twords\tprimes\trainbow\tclear\nmath\tbf\tuptime\n"); } else if (strcmp(input_buffer, "panic") == 0) { @@ -47,6 +47,14 @@ void shell_install() { program_math(); } + else if (strcmp(input_buffer, "bf") == 0) + { + program_bf(); + } + else if (strcmp(input_buffer, "uptime") == 0) + { + program_uptime(); + } else { printf("Unknown command %s\n", input_buffer); } diff --git a/src/kernel/system.h b/src/kernel/system.h index f551d0c..0ca520e 100644 --- a/src/kernel/system.h +++ b/src/kernel/system.h @@ -22,6 +22,7 @@ void delay(int ticks); void keyboard_install(); char keyboard_getchar(); void shell_install(); +int uptime(); extern volatile unsigned long global_ticks; diff --git a/src/programs/bf.c b/src/programs/bf.c new file mode 100644 index 0000000..33bcb03 --- /dev/null +++ b/src/programs/bf.c @@ -0,0 +1,55 @@ + +#include "../kernel/system.h" +#include "../libc/stdio.h" + +#define BUF_SIZE 256 + +void brainfuck(char* input) +{ + unsigned char tape[30000] = {0}; + unsigned char* ptr = tape; + char current_char; + size_t i; + size_t loop; + + for (i=0; input[i] != 0; i++) + { + current_char = input[i]; + if (current_char == '>') { + ++ptr; + } else if (current_char == '<') { + --ptr; + } else if (current_char == '+') { + ++*ptr; + } else if (current_char == '-') { + --*ptr; + } else if (current_char == '.') { + putc(*ptr); + } else if (current_char == ',') { + *ptr = keyboard_getchar(); + } else if (current_char == '[') { + continue; + } else if (current_char == ']' && *ptr) { + loop = 1; + while (loop > 0) + { + current_char = input[--i]; + if (current_char == '[') { + loop--; + } else if (current_char == ']') { + loop++; + } + } + } + } +} + +void program_bf() +{ + char input_buffer[BUF_SIZE]; + puts("Brainfuck code? "); + get_input(input_buffer, BUF_SIZE); + brainfuck(input_buffer); + //brainfuck(",[.[-],]"); + puts("\n"); +} diff --git a/src/programs/misc.c b/src/programs/misc.c index 3836373..321c9a6 100644 --- a/src/programs/misc.c +++ b/src/programs/misc.c @@ -1,6 +1,7 @@ // Miscellaneous small programs #include "../libc/stdio.h" +#include "../kernel/system.h" // Print a rainbow colorful text for testing @@ -29,3 +30,10 @@ void program_clear() { for (int i=0; i