From dd1bc6acdca6a3f5eba4196462d2b65eecd810c3 Mon Sep 17 00:00:00 2001 From: Garritt McCune Date: Fri, 4 Dec 2020 00:06:27 -0600 Subject: [PATCH] Probably the final commit for this, only so this commit can be pushed to the new Gitea server. --- images/first.png | Bin 0 -> 23967 bytes images/grub with catos.png | Bin 0 -> 10678 bytes include/buildnumber.h | 6 +- include/string.h | 6 ++ src/kernel.c | 135 ++++++++++++++++++------------------- src/memorymanager.c | 12 ++-- src/pci.c | 10 +-- src/printf.c | 9 +++ src/string.c | 3 + 9 files changed, 98 insertions(+), 83 deletions(-) create mode 100644 images/first.png create mode 100644 images/grub with catos.png create mode 100644 include/string.h create mode 100644 src/printf.c create mode 100644 src/string.c diff --git a/images/first.png b/images/first.png new file mode 100644 index 0000000000000000000000000000000000000000..58978a45bb580dc5721a5d9f87dc602e714ce70d GIT binary patch literal 23967 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 literal 0 HcmV?d00001 diff --git a/include/buildnumber.h b/include/buildnumber.h index 62f77fa..7321579 100644 --- a/include/buildnumber.h +++ b/include/buildnumber.h @@ -1,10 +1,10 @@ #ifndef BUILD_NUMBER -#define BUILD_NUMBER "349" +#define BUILD_NUMBER "389" #endif #ifndef VERSION_STR -#define VERSION_STR "0.0.2+349 - Sun 01 Sep 2019 03:15:31 PM CDT" +#define VERSION_STR "0.0.2+389 - Fri Dec 4 12:05:33 AM CST 2020" #endif #ifndef VERSION_STR_SHORT #define VERSION_STR_SHORT -unsigned char* version_str_short = "0.0.2+349"; +unsigned char* version_str_short = "0.0.2+389"; #endif diff --git a/include/string.h b/include/string.h new file mode 100644 index 0000000..12b57ff --- /dev/null +++ b/include/string.h @@ -0,0 +1,6 @@ +#ifndef STRING_H +#define STRING_H + + + +#endif \ No newline at end of file diff --git a/src/kernel.c b/src/kernel.c index ffd5f1d..18a8308 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -77,10 +77,20 @@ bool strcmpstart(char* str1, char* str2) char* int_to_string(unsigned int value, int base) { static char buf[32] = {0}; - + //void* ptr = Malloc(32); + //if(ptr == 0) + //{ + //puts("Malloc failed to allocate!\n"); + //return ""; + //} + + //char buf = (char*) ptr; + if(value == 0) { buf[0] = '0'; + //*buf++ = '0'; + //return buf; return &buf[0]; } @@ -88,9 +98,12 @@ char* int_to_string(unsigned int value, int base) for(; value && i; --i, value /= base) { + //*buf++ = "0123456789ABCDEF"[value % base]; buf[i] = "0123456789ABCDEF"[value % base]; } - + + //Free(ptr); + //return buf; return &buf[i+1]; } @@ -143,20 +156,39 @@ void outportb (unsigned short _port, unsigned char _data) __asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data)); } +unsigned char setupstuff() +{ + uint8_t* buffer = Malloc(4096); + unsigned char str = (unsigned char*) *buffer; + //str = "Top kek"; + memcpy(str, "Top kek", 8); + puts("From inside the method:\n"); + puts(str); + puts("\n"); + Free((void*) buffer); + uint8_t* buffer2 = Malloc(4096); + unsigned char str2 = *buffer2; + //str2 = "Even more memey then the last"; + memcpy(str2, "More memes", 11); + Free(buffer2); + + return str; +} + //extern void* _sys_stack; extern void main(uint32_t multiboot_magic, const void* multiboot_structure) { init_video(); puts("Video initialized.\n"); - register int base asm("ebp"); - puts("Base pointer address: "); - puts(int_to_string(base, 10)); - puts("\n"); - register int pointer asm("esp"); - puts("Instruction pointer address: 0x"); - puts(int_to_string(pointer, 16)); - puts("\n"); + //register int base asm("ebp"); + //puts("Base pointer address: "); + //puts(int_to_string(base, 10)); + //puts("\n"); + //register int pointer asm("esp"); + //puts("Instruction pointer address: 0x"); + //puts(int_to_string(pointer, 16)); + //puts("\n"); //Only for testing if the multiboot structure can be read or not. if(multiboot_magic == 0x2BADB002) { @@ -188,31 +220,23 @@ extern void main(uint32_t multiboot_magic, const void* multiboot_structure) puts(int_to_string(multiboot_structure, 16)); puts("\n"); uint32_t* videoBuffer = (uint32_t*)(((size_t)multiboot_structure) + 88); - puts("Framebuffer address: "); - puts(int_to_string((*videoBuffer), 16)); - puts("\n"); + //puts("Framebuffer address: "); + //puts(int_to_string((*videoBuffer), 16)); + //puts("\n"); uint32_t* totalMem = (uint32_t*)(((size_t)multiboot_structure) + 8); puts(int_to_string((*totalMem) * 1024, 10)); puts(" kilobytes of RAM installed on the system\n"); gdt_install(); puts("Global Descriptor Table initialized.\n"); //Set a new heap to the same size as the total system memory, in bytes. + puts("Intializing pyscial memory manager.\n"); size_t heap = ((*totalMem) - 10240) * 1024; MemoryManager(heap, heap);//(*totalMem)*1024 - heap - 10*1024); //second needs to be an address not size - //puts("Mem lower: 0x"); - //puts(int_to_string(*(uint32_t*)(((size_t)multiboot_structure) + 4), 10)); - puts("Heap size: "); - puts(int_to_string(heap / 1024, 10)); - puts(" in kilobytes.\n"); - - struct MemoryChunk* al = (struct MemoryChunk*) Malloc(2984); - struct MemoryChunk* al2 = (struct MemoryChunk*) Malloc(3984); - //for(int i = 0; i < 600; i++) - //{ - // target[i] = 9; - //} - Free((void*) al); - Free((void*) al2); + //puts("Mem lower: 0x"); + //puts(int_to_string(*(uint32_t*)(((size_t)multiboot_structure) + 4), 10)); + //puts("Heap size: "); + //puts(int_to_string(heap / 1024, 10)); + //puts(" in kilobytes.\n"); idt_install(); puts("Interrupt Descriptor Table initialized.\n"); @@ -228,28 +252,25 @@ extern void main(uint32_t multiboot_magic, const void* multiboot_structure) //puts("Installed Timer.\n"); kb_install(); puts("Keyboard installed.\n"); - puts("SDOS Version "); - puts(version_str_short); - puts(" Initialized.\n"); - puts("Compile Date "); - puts(__DATE__); + puts(strconcat("SDOS Version ", version_str_short)); + puts(strconcat("\nCompile Date ", __DATE__)); puts("\n"); - unsigned char result = strconcat("Hello", " World!\n"); - puts(result); - //Free(eh); - //puts(strconcat("Hello ", "World!\n")); - //puts(strconcat("Concat test ", "number 2\n")); - //puts(__DATE__); - //puts("\n"); //puts(__TIME__); //puts("\n"); - puts("Setting up paging\n"); + //puts("Setting up paging\n"); //setupstuff(); + puts("Testing Malloc:\n"); + unsigned char strr = setupstuff(); + puts(strr); + puts("\n"); + //puts(strconcat("\nCompile Date ", __DATE__)); + //puts("\n"); + run_shell(); //puts(&__BUILD_DATE); //puts(&__BUILD_NUMBER); - //puts("Divide by zero check:\n"); - //puts(5 / 0); + puts("Divide by zero check:\n"); + puts(5 / 0); } void idle(void) @@ -258,33 +279,9 @@ void idle(void) //__asm__ __volatile__ ("hlt"); } -void setupstuff() +void halt(void) { -uint64_t page_dir_ptr_tab[4] __attribute__((aligned(0x20))); // must be aligned to (at least)0x20, ... - // ... turning out that you can put more of them into one page, saving memory - - // 512 entries -uint64_t page_dir[512] __attribute__((aligned(0x1000))); // must be aligned to page boundary -uint64_t page_tab[512] __attribute__((aligned(0x1000))); - -page_dir_ptr_tab[0] = (uint64_t)&page_dir | 1; // set the page directory into the PDPT and mark it present -page_dir[0] = (uint64_t)&page_tab | 3; //set the page table into the PD and mark it present/writable - -unsigned int i, address = 0; -for(i = 0; i < 512; i++) -{ - page_tab[i] = address | 3; // map address and mark it present/writable - address = address + 0x1000; + asm("cli"); + asm("hlt"); } -asm volatile ("movl %cr4, %eax; bts $5, %eax; movl %eax, %cr4"); // set bit5 in CR4 to enable PAE -asm volatile ("movl %%eax, %%cr3" :: "a" (&page_dir_ptr_tab)); // load PDPT into CR3 -asm volatile ("movl %cr0, %eax; orl $0x80000000, %eax; movl %eax, %cr0;"); - -//uint64_t * page_dir_temp = (uint64_t*) page_dir_ptr_tab[3]; // get the page directory (you should 'and' the flags away) -page_dir[511] = (uint64_t*) page_dir_ptr_tab[3];//(uint64_t)page_dir_temp; // map pd to itself -page_dir[510] = page_dir_ptr_tab[2]; // map pd3 to it -page_dir[509] = page_dir_ptr_tab[1]; // map pd2 to it -page_dir[508] = page_dir_ptr_tab[0]; // map pd1 to it -page_dir[507] = (uint64_t)&page_dir_ptr_tab; /* map the PDPT to the directory*/ -} diff --git a/src/memorymanager.c b/src/memorymanager.c index fecac63..0bcb37c 100644 --- a/src/memorymanager.c +++ b/src/memorymanager.c @@ -58,17 +58,17 @@ void* Malloc(size_t size) } freeChunk->Allocated = true; - puts("Address of new chunk: 0x"); - puts(int_to_string((size_t)freeChunk, 16)); - puts("\n"); + //puts("Address of new chunk: 0x"); + //puts(int_to_string((size_t)freeChunk, 16)); + //puts("\n"); return (void*)(((size_t) freeChunk) + sizeof(struct MemoryChunk)); } void Free(void* ptr) { - puts("Recieved pointer at 0x"); - puts(int_to_string(ptr - sizeof(struct MemoryChunk), 16)); - puts("\n"); + //puts("Recieved pointer at 0x"); + //puts(int_to_string(ptr - sizeof(struct MemoryChunk), 16)); + //puts("\n"); struct MemoryChunk* chunk = (struct MemoryChunk*)(((size_t) ptr) - sizeof(struct MemoryChunk)); chunk->Allocated = false; diff --git a/src/pci.c b/src/pci.c index 151b723..006e37b 100644 --- a/src/pci.c +++ b/src/pci.c @@ -60,10 +60,10 @@ void EnumPCISubsystem() } else if(dev.VendorId != lastId) { - puts("Vendor ID not empty: "); - puts(int_to_string(dev.VendorId, 10)); - puts("\n"); - lastId = dev.VendorId; + //puts("Vendor ID not empty: "); + //puts(int_to_string(dev.VendorId, 10)); + //puts("\n"); + //lastId = dev.VendorId; } //puts("PCI BUS "); //puts(int_to_string(bus, 16)); @@ -100,4 +100,4 @@ struct DeviceDescriptor GetDeviceDescriptor(uint16_t busNumber, uint16_t deviceN result.Interrupt = Read(busNumber, deviceNumber, functionNumber, 0x3C); return result; -} \ No newline at end of file +} diff --git a/src/printf.c b/src/printf.c new file mode 100644 index 0000000..893e276 --- /dev/null +++ b/src/printf.c @@ -0,0 +1,9 @@ + +void printf(char *format_string, ...) +{ + va_list arg; + + va_start(arg, format_string); + + va_end(arg); +} \ No newline at end of file diff --git a/src/string.c b/src/string.c new file mode 100644 index 0000000..c935b1d --- /dev/null +++ b/src/string.c @@ -0,0 +1,3 @@ +#include "../include/string.h" +#include "../include/system.h" +#include "../include/memorymanager.h" \ No newline at end of file