diff --git a/docs/DEVELOPERS.md b/docs/DEVELOPERS.md index 760e985..1072ad1 100644 --- a/docs/DEVELOPERS.md +++ b/docs/DEVELOPERS.md @@ -1,5 +1,12 @@ # Blank OS Developer's Manual +## Table of Contents + +- [Getting Started](#getting-started) +- [Writing programs for BlankOS](#writing-programs) +- [Changing the TTY font](#changing-font) + + ## Getting Started ### System description @@ -27,7 +34,10 @@ gdb kernel.elf (gdb) target remote localhost:1234 ``` -## Making programs for the OS + +## Writing programs for BlankOS + +Be warned, these are not actual programs in the sense you'd expect. These are indeed functions that are called from the shell, and embedded in the kernel ELF binary. Real programs apart from the kernel are not yet a thing here, but might be one day. ### Step 1 - Making the program and the entry point @@ -86,4 +96,19 @@ The linking process should be taken care of by the appropriate Linker script `li If you're proud of what you've made, you can clone the repo, make your changes, open a pull request and maybe your program will be added to the main BlankOS repo, and later distributed in the new ISOs! + +## Changing the TTY font +In order to change the default font, first get your hands on a 8x16 `.psf` (PC Screen Font 2) formatted font. Then, put it in `include/fonts` and remove the default one (`UniCyr_8x16.psf`). + +Go ahead and run `make` one time. The compilation/linking will fail because of unresolved symbols, but an object file should have been created in `build/fonts` with your custom font's name. + +Read the symbols in that object file: + +``` +readelf -s -W build/fonts/YOUR_FONT_8x16.o +``` + +Get the symbol name that ends with `_start` and replace all occurences of it in the `src/drivers/framebuffer.c` file. + +Then, run `make` again and the font should have changed properly. diff --git a/src/kernel/kmain.c b/src/kernel/kmain.c index 8aff6c6..4039830 100644 --- a/src/kernel/kmain.c +++ b/src/kernel/kmain.c @@ -8,7 +8,6 @@ #include "gdt.h" #include "idt.h" #include "system.h" -#include "paging.h" #include "../drivers/ata.h" #include #include "../drivers/framebuffer.h" @@ -62,10 +61,7 @@ void kmain(multiboot2_info *mb_info) irq_install(); __asm__ __volatile__("sti"); - //init_paging(); //test_read_sector(); - //uint32_t *ptr = (uint32_t*)0xA0000000; - //uint32_t do_page_fault = *ptr; timer_install(); keyboard_install(); diff --git a/src/kernel/loader.s b/src/kernel/loader.s index aa53c33..44f5fbe 100644 --- a/src/kernel/loader.s +++ b/src/kernel/loader.s @@ -26,7 +26,7 @@ CHECKSUM equ -(MAGIC_NUMBER + FLAGS + HEADER_LEN) ; Tags? (28bytes) ; Tag 1 : set graphics mode (only recommended, can be overriden by GRUB) - + align 8 dw 5 ; 2 dw 0 ; 2 dd 20 ; 4 @@ -36,8 +36,9 @@ CHECKSUM equ -(MAGIC_NUMBER + FLAGS + HEADER_LEN) ; End of tags + align 8 + dw 0 ; 2 dw 0 ; 2 - ;dw 0 ; 2 dd 8 ; 4 ; End of Multiboot 2 header diff --git a/src/kernel/paging.c b/src/kernel/paging.c deleted file mode 100644 index daa964a..0000000 --- a/src/kernel/paging.c +++ /dev/null @@ -1,151 +0,0 @@ -// Paging kernel module -// Author: xamidev -// Licensed under the Unlicense. See the repo below. -// https://github.com/xamidev/blankos - -#include -#include "paging.h" -#include "../libc/stdio.h" -#include "system.h" -#include "kheap.h" - -uint32_t *frames; -uint32_t nframes; - -extern uint32_t placement_address; - -static void set_frame(uint32_t frame_addr) -{ - uint32_t frame = frame_addr/0x1000; - uint32_t idx = INDEX_FROM_BIT(frame); - uint32_t off = OFFSET_FROM_BIT(frame); - frames[idx] |= (0x1 << off); -} - -static void clear_frame(uint32_t frame_addr) -{ - uint32_t frame = frame_addr/0x1000; - uint32_t idx = INDEX_FROM_BIT(frame); - uint32_t off = OFFSET_FROM_BIT(frame); - frames[idx] &= ~(0x1 << off); -} - -/* -static uint32_t test_frame(uint32_t frame_addr) -{ - uint32_t frame = frame_addr/0x1000; - uint32_t idx = INDEX_FROM_BIT(frame); - uint32_t off = OFFSET_FROM_BIT(frame); - return (frames[idx] & (0x1 << off)); -} -*/ - -static uint32_t first_frame() -{ - uint32_t i, j; - for (i=0; iframe != 0) - { - return; - } else { - uint32_t idx = first_frame(); - if (idx == (uint32_t)-1) - { - panic(); - } - set_frame(idx*0x1000); - page->present = 1; - page->rw = (is_writeable)?1:0; - page->user = (is_kernel)?0:1; - page->frame = idx; - } -} - -void free_frame(page_t *page) -{ - uint32_t frame; - if (!(frame=page->frame)) - { - return; - } else { - clear_frame(frame); - page->frame = 0x0; - } -} - -void init_paging() -{ - uint32_t mem_end_page = 0x10000000; - nframes = mem_end_page / 0x1000; - frames = (uint32_t*)kmalloc(INDEX_FROM_BIT(nframes)); - memset(frames, 0, INDEX_FROM_BIT(nframes)); - - page_directory_t* kernel_directory = (page_directory_t*)kmalloc_a(sizeof(page_directory_t)); - memset(kernel_directory, 0, sizeof(page_directory_t)); - //page_directory_t* current_directory = kernel_directory; - - unsigned int i = 0; - while (i < placement_address) - { - alloc_frame(get_page(i, 1, kernel_directory), 0, 0); - i += 0x1000; - } - - irq_install_handler(14, page_fault); - - switch_page_directory(kernel_directory); -} - -void switch_page_directory(page_directory_t *dir) -{ - //page_directory_t* current_directory = dir; - asm volatile("mov %0, %%cr3":: "r"(&dir->tablesPhysical)); - uint32_t cr0; - asm volatile("mov %%cr0, %0": "=r"(cr0)); - cr0 |= 0x80000000; - asm volatile("mov %0, %%cr0":: "r"(cr0)); -} - -page_t *get_page(uint32_t address, int make, page_directory_t *dir) -{ - address /= 0x1000; - uint32_t table_idx = address / 1024; - if (dir->tables[table_idx]) - { - return &dir->tables[table_idx]->pages[address%1024]; - } else if (make) - { - uint32_t tmp; - dir->tables[table_idx] = (page_table_t*)kmalloc_ap(sizeof(page_table_t), &tmp); - memset(dir->tables[table_idx], 0, 0x1000); - dir->tablesPhysical[table_idx] = tmp | 0x7; - return &dir->tables[table_idx]->pages[address%1024]; - } else { - return 0; - } - return 0; -} - -void page_fault() -{ - puts("Page fault"); - panic(); -} diff --git a/src/kernel/paging.h b/src/kernel/paging.h deleted file mode 100644 index fa7f063..0000000 --- a/src/kernel/paging.h +++ /dev/null @@ -1,43 +0,0 @@ -// Paging kernel module header -// Author: xamidev -// Licensed under the Unlicense. See the repo below. -// https://github.com/xamidev/blankos - -#ifndef PAGING_H -#define PAGING_H - -#include "system.h" -#include - -#define INDEX_FROM_BIT(a) (a/(8*4)) -#define OFFSET_FROM_BIT(a) (a%(8*4)) - -typedef struct -{ - uint32_t present : 1; - uint32_t rw : 1; - uint32_t user : 1; - uint32_t accessed : 1; - uint32_t dirty : 1; - uint32_t unused : 7; - uint32_t frame : 20; -} page_t; - -typedef struct -{ - page_t pages[1024]; -} page_table_t; - -typedef struct -{ - page_table_t *tables[1024]; - uint32_t tablesPhysical[1024]; - uint32_t physicalAsddr; -} page_directory_t; - -void init_paging(); -void switch_page_directory(page_directory_t *new); -page_t *get_page(uint32_t address, int make, page_directory_t *dir); -void page_fault(); - -#endif diff --git a/src/kernel/shell.c b/src/kernel/shell.c index 21c55bd..de32a88 100644 --- a/src/kernel/shell.c +++ b/src/kernel/shell.c @@ -12,7 +12,7 @@ #include "../drivers/rtc.h" #define BUFFER_SIZE 256 -#define MAX_COMMANDS 16 +#define MAX_COMMANDS 64 #define MAX_ARGS 64 // Splash screen: esthetic stuff. @@ -25,6 +25,8 @@ char* motd[] = }; int motd_size = sizeof(motd)/sizeof(motd[0]); +bool do_splash = true; + void splash() { int random = randint(time_seed()); @@ -87,7 +89,11 @@ int parse_input(char* input, char* argv[], int max_args) void shell_install() { - splash(); + if (do_splash == true) + { + do_splash = false; + splash(); + } register_command("help", program_help); register_command("panic", program_panic); @@ -104,6 +110,9 @@ void shell_install() register_command("rot13", program_rot13); register_command("morse", program_morse); register_command("cowsay", program_cowsay); + register_command("time", program_time); + register_command("read", program_read); + register_command("reboot", program_reboot); for (;;) { diff --git a/src/libc/stdio.h b/src/libc/stdio.h index 84dac49..5511d08 100644 --- a/src/libc/stdio.h +++ b/src/libc/stdio.h @@ -56,12 +56,35 @@ void dtostrf(double val, char *buffer, int precision); enum Colors { // AARRGGBB? - white = 0xFFFFFFFF, - black = 0x00000000, - red = 0x00FF0000, - green = 0x0000FF00, - blue = 0x000000FF, - yellow = 0x00FFFF00, + white = 0xFFFFFFFF, + black = 0x00000000, + red = 0x00FF0000, + green = 0x0000FF00, + blue = 0x000000FF, + yellow = 0x00FFFF00, + cyan = 0x0000FFFF, + magenta = 0x00FF00FF, + orange = 0x00FFA500, + purple = 0x00800080, + brown = 0x00A52A2A, + gray = 0x00808080, + pink = 0x00FFC0CB, + lime = 0x00BFFF00, + navy = 0x00000080, + teal = 0x00008080, + maroon = 0x00800000, + olive = 0x00808000, + silver = 0x00C0C0C0, + gold = 0x00FFD700, + indigo = 0x004B0082, + violet = 0x00EE82EE, + coral = 0x00FF7F50, + turquoise = 0x0040E0D0, + salmon = 0x00FA8072, + chocolate = 0x00D2691E, + khaki = 0x00F0E68C, + lavender = 0x00E6E6FA, + beige = 0x00F5F5DC }; #endif diff --git a/src/programs/ciphers.c b/src/programs/ciphers.c index 4d9a324..4ff9460 100644 --- a/src/programs/ciphers.c +++ b/src/programs/ciphers.c @@ -29,14 +29,27 @@ void rot13(char* input, char* output) output[i] = '\0'; } -void program_rot13() +void program_rot13(int argc, char* argv[]) { - char input_buffer[BUFFER_SIZE]; - char output[BUFFER_SIZE]; - puts("String? "); - get_input(input_buffer, BUFFER_SIZE); + if (argc < 2) + { + printf("Usage: %s \n", argv[0]); + return; + } + + char input_buffer[BUFFER_SIZE] = {0}; + char output[BUFFER_SIZE] = {0}; + + for (int i=1; i\n", argv[0]); + return; + } + char output[512]; - char input_buffer[BUFFER_SIZE]; - puts("String? "); - get_input(input_buffer, BUFFER_SIZE); - to_morse(input_buffer, output); - printf("\n%s\n", output); + char message[BUFFER_SIZE]; + + for (int i=1; i\n", argv[0]); + return; + } + + char input_buffer[BUF_SIZE] = {0}; + for (int i=1; i\n", argv[0]); + } else if (argc == 2) + { + uint8_t buffer[512]; + ata_read_sector(atoi(argv[1]), buffer); + + for (int i=0; i<512; i++) + { + if (i%50==0) puts("\n"); // hardcoded = bad + printf("%02x ", buffer[i]); + } + puts("\n"); + } else + { + puts("Invalid argument number\n"); + } +} + +// Reboots the machine (might just shutdown) + +void program_reboot() +{ + puts("Rebooting...\n"); + + while(inb(0x64) & 0x02); + outb(0x64, 0xFE); + + while (1) asm volatile("hlt"); +} diff --git a/src/programs/programs.h b/src/programs/programs.h index 8f6d327..6d3b212 100644 --- a/src/programs/programs.h +++ b/src/programs/programs.h @@ -29,5 +29,8 @@ void program_uptime(); void program_panic(); void program_help(); void program_echo(); +void program_time(); +void program_read(); +void program_reboot(); #endif