From b352d3f4e2035eea96fe78da6738687f50fb2350 Mon Sep 17 00:00:00 2001 From: xamidev Date: Wed, 24 Jul 2024 12:47:12 +0200 Subject: [PATCH] Fix: backspace, shift (kb driver) + Add: doc + ascii art --- DEVELOPERS.md | 23 +++++++++++++++ README.md | 11 +++---- USERS.md | 17 +++++++++++ iso/boot/kernel.elf | Bin 21404 -> 25720 bytes os.iso | Bin 497664 -> 501760 bytes src/kernel/kb.c | 69 ++++++++++++++++++++++++++++++++++++++++---- src/kernel/kmain.c | 15 +++++++--- src/kernel/shell.c | 2 +- src/libc/stdio.c | 28 +++++++++++++++--- 9 files changed, 146 insertions(+), 19 deletions(-) create mode 100644 DEVELOPERS.md create mode 100644 USERS.md diff --git a/DEVELOPERS.md b/DEVELOPERS.md new file mode 100644 index 0000000..0551f5b --- /dev/null +++ b/DEVELOPERS.md @@ -0,0 +1,23 @@ +# Blank OS Developer's Manual + +## Getting Started + +### System description + +Blank OS runs on a monolithic kernel booted by a 3rd party bootloader; GRUB (whose executable is named `stage2_eltorito`). The kernel is compiled in ELF format. The target processor architecture is 32-bit x86. Blank OS is BIOS-independent which means it does not use Real mode BIOS functions as its routines. It rather uses in and out port communication to communicate with hardware directly (such as the keyboard) and it uses specific memory locations (for example the framebuffer to manage the screen in text mode). + +### Code structure + +The source code is available in folder `src`. You will find subfolders corresponding to appropriate system parts, such as the kernel, the C library (including drivers) and programs. + +## Making programs for the OS + +### Programming + +Basically you can use the kernel C library functions available in `src/libc/` and make programs out of those functions. Then you can set up the shell for your program to be launchable. + +More on that soon. + +### Compiling and linking + +The linking process should be taken care by the appropriate Linker script `link.ld` and the Makefile instructions and targets. diff --git a/README.md b/README.md index de1a7cf..0fa4573 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,10 @@ # 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 to be ran using the kernel. +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! Next steps for this project will be: -- ISRs and making the PIC work -- Keyboard driver - User programs -- Shell -- Kernel libc +- Completing the kernel libc - Filesystem support ## Usage @@ -54,6 +51,10 @@ 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 + +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. + ### ⚠️ Disclaimer This is a hobbyist operating system kernel and it comes without any warranty whatsoever! It isn't capable of anything really. Feedback and contributions are highly appreciated! diff --git a/USERS.md b/USERS.md new file mode 100644 index 0000000..bf15b39 --- /dev/null +++ b/USERS.md @@ -0,0 +1,17 @@ +# Blank OS User's Manual + +## Getting started + +### Installation and emulation/execution + +Please refer to the relevant sections in the project `README.md` available in the root folder. + +### First steps + +Once you have launched the OS for the first time, you should first see the welcome banner with the system version. Then, the kernel shell will spawn and you will be able to execute commands. + +To get the list of available commands on the system, type `help`. + +## Next what? + +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. diff --git a/iso/boot/kernel.elf b/iso/boot/kernel.elf index 5a127dfdd4f7312c8255d310458503f0c7635465..8602aa2fe2693c51cfac1cb2ec14547b5b2e1ebd 100755 GIT binary patch delta 7466 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

jUIhLjL1wv79m4$Be&F61nbDy`n7(?& z#K|n*z{h~ou&L>i!T%7r1^m|x{z>2yBW1P>-&dh;XPHG92^E-?AtT`>=R(g#Qy>~ zHBn|04E_HGeqZO?u}Lhf6NJ54-VFR$5AXz&fos4om@4D}{Gvz5oMRD)2R74-Y8?kWL0r^1Vicxxg=)0-6r&iN+=}_zQqPHU+c<_=_r%ANvVh771L(h~hU@NQGaJAk*C z@NVEZEYTx|`~lK8Icx@|e;4ZTK>@u5+yZ^kq^SajK{ywQJ%CSgcmkg(CI=nB@0kpq z0seFd0yLhAuYea}jc+$_C-5>~$pe@Nc&lkogb02(o)Sm4(d@z@|XS(+vYl zA+X=H2UY;DMJN2Fmk)WKB#VD3D4=!VN0}0+1^&|H@G;#A_q3-}z>_rFwzs=BN z)&N2t9MEA+23^1#Oa|P*gTeQ9%ALSV&{~%o^80|FG|B%CIK_lpfcKgLdNA z)q94+Ae8t=6F(ey3=SVUjHyBq!1<;Ch6C?FiM@?R0X}cyrvg7~vX>UHoUs|$rT8@k z!;ejbzzCBj=FT!dnSFfsF{!n!V z-h=slv$Jz1vy3@8lW?1oh1=v@y5-O<8@KEUbR(E8;1rsXM)suUle1rvLd$C&SiO3A z?dsaK6@0_ov!QENtlU_$TsUc-JMW5xPb*$!S)9oC6~_lsTV7niKPpZNq^EHiO`~{N zNmwBD!}09^=Y56FSy~c44sC+|kfawB@1+W@Um!z|t!{EPX&l_UjID^rTm z^7xSw#fmMx3*dR)S(0qoRm=yKriQ-@0*)p&2p?&@pfon%-Fq2Z!^=yP14flIc8Z@a Gj`$x-3lrJ^ delta 6556 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 Apa1{> delta 6912 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 HMI8DE58;5q diff --git a/src/kernel/kb.c b/src/kernel/kb.c index 437d0d8..77d3c31 100644 --- a/src/kernel/kb.c +++ b/src/kernel/kb.c @@ -4,6 +4,11 @@ #define KEYBOARD_BUFFER_SIZE 256 +#define LEFT_SHIFT_PRESSED 0x2A +#define RIGHT_SHIFT_PRESSED 0x36 +#define LEFT_SHIFT_RELEASED 0xAA +#define RIGHT_SHIFT_RELEASED 0xB6 + unsigned char kbdus[128] = { 0, 27, '1', '2', '3', '4', '5', '6', '7', '8', /* 9 */ @@ -44,9 +49,50 @@ unsigned char kbdus[128] = 0, /* All other keys are undefined */ }; +unsigned char kbdus_shift[128] = +{ + 0, 27, '!', '@', '#', '$', '%', '^', '&', '*', /* 9 */ + '(', ')', '_', '+', '\b', /* Backspace */ + '\t', /* Tab */ + 'Q', 'W', 'E', 'R', /* 19 */ + 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '\n', /* Enter key */ + 0, /* 29 - Control */ + 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', /* 39 */ + '"', '~', 0, /* Left shift */ + '|', 'Z', 'X', 'C', 'V', 'B', 'N', /* 49 */ + 'M', '<', '>', '?', 0, /* Right shift */ + '*', + 0, /* Alt */ + ' ', /* Space bar */ + 0, /* Caps lock */ + 0, /* 59 - F1 key ... > */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, /* < ... F10 */ + 0, /* 69 - Num lock*/ + 0, /* Scroll Lock */ + 0, /* Home key */ + 0, /* Up Arrow */ + 0, /* Page Up */ + '-', + 0, /* Left Arrow */ + 0, + 0, /* Right Arrow */ + '+', + 0, /* 79 - End key*/ + 0, /* Down Arrow */ + 0, /* Page Down */ + 0, /* Insert Key */ + 0, /* Delete Key */ + 0, 0, 0, + 0, /* F11 Key */ + 0, /* F12 Key */ + 0, /* All other keys are undefined */ +}; + static char keyboard_buffer[KEYBOARD_BUFFER_SIZE]; static unsigned int keyboard_buffer_start = 0; static unsigned int keyboard_buffer_end = 0; +static int shift_pressed = 0; void keyboard_handler() { @@ -56,14 +102,27 @@ void keyboard_handler() if (scancode & 0x80) { + if (scancode == LEFT_SHIFT_RELEASED || scancode == RIGHT_SHIFT_RELEASED) { + shift_pressed = 0; + } } else { - char c = kbdus[scancode]; - if (c) - { - keyboard_buffer[keyboard_buffer_end] = c; - keyboard_buffer_end = (keyboard_buffer_end+1) % KEYBOARD_BUFFER_SIZE; + if (scancode == LEFT_SHIFT_PRESSED || scancode == RIGHT_SHIFT_PRESSED) { + shift_pressed = 1; + } else { + char c; + if (shift_pressed) { + c = kbdus_shift[scancode]; + } else { + c = kbdus[scancode]; + } + + if (c) + { + keyboard_buffer[keyboard_buffer_end] = c; + keyboard_buffer_end = (keyboard_buffer_end+1) % KEYBOARD_BUFFER_SIZE; + } } } } diff --git a/src/kernel/kmain.c b/src/kernel/kmain.c index a382462..4371303 100644 --- a/src/kernel/kmain.c +++ b/src/kernel/kmain.c @@ -4,6 +4,15 @@ #include "idt.h" #include "system.h" +char* ascii_title = +"\n" +" oooooooooo o888 oooo ooooooo oooooooo8\n" +" 888 888 888 ooooooo oo oooooo 888 ooooo o888 888o 888 \n" +" 888oooo88 888 ooooo888 888 888 888o888 888 888 888oooooo \n" +" 888 888 888 888 888 888 888 8888 88o 888o o888 888\n" +" o888ooo888 o888o 88ooo88 8o o888o o888o o888o o888o 88ooo88 o88oooo888\n\n" +" --------------------------------- v0.3.31 --------------------------------\n\n"; + int kmain(int retvalue) { @@ -23,12 +32,10 @@ int kmain(int retvalue) clear(); - colorputs("Blank OS version 1 iteration 3 minor 20\n", 10); + colorputs(ascii_title, 10); - // TODO: Serial printf to dump registers on kernel panic - // TODO: Fix scrolling bug (framebuffer driver) - // TODO: Fix keyboard driver bug (some keys mapped weirdly) + add suport for SHIFT and backspace (deleting character) // TODO: Grub modules to load programs + //timer_install(); keyboard_install(); diff --git a/src/kernel/shell.c b/src/kernel/shell.c index ef5036a..d94cb2c 100644 --- a/src/kernel/shell.c +++ b/src/kernel/shell.c @@ -27,7 +27,7 @@ void shell_install() printf("%d", 4/0); } else { - puts("Unknown command\n"); + printf("Unknown command %s\n", input_buffer); } } } diff --git a/src/libc/stdio.c b/src/libc/stdio.c index 5749432..c356875 100644 --- a/src/libc/stdio.c +++ b/src/libc/stdio.c @@ -101,6 +101,17 @@ void putc(char c) VGA_Y++; } break; + case '\b': + if (VGA_X > 0) + { + VGA_X--; + } + else if (VGA_Y > 0) { + VGA_Y--; + VGA_X = VGA_WIDTH-1; + } + putchar(VGA_X, VGA_Y, ' '); + break; default: putchar(VGA_X, VGA_Y, c); VGA_X++; @@ -366,10 +377,19 @@ void get_input(char *buffer, int size) { while (index < size-1) { c = getch(); - if (c == '\n') break; - - buffer[index++] = c; - putc(c); + if (c == '\n') { + break; + } else if (c == '\b') { + if (index > 0) { + index--; + putc('\b'); + putc(' '); + putc('\b'); + } + } else { + buffer[index++] = c; + putc(c); + } } buffer[index] = '\0'; }