Got the string concat funcion working.

This commit is contained in:
2019-09-01 17:51:28 -05:00
parent 658a380f9a
commit 5b66184ea0
7 changed files with 87 additions and 45 deletions
+3 -3
View File
@@ -1,10 +1,10 @@
#ifndef BUILD_NUMBER
#define BUILD_NUMBER "276"
#define BUILD_NUMBER "349"
#endif
#ifndef VERSION_STR
#define VERSION_STR "0.0.2+276 - Sat 31 Aug 2019 05:43:54 PM CDT"
#define VERSION_STR "0.0.2+349 - Sun 01 Sep 2019 03:15:31 PM CDT"
#endif
#ifndef VERSION_STR_SHORT
#define VERSION_STR_SHORT
unsigned char* version_str_short = "0.0.2+276";
unsigned char* version_str_short = "0.0.2+349";
#endif
+1
View File
@@ -6,6 +6,7 @@ typedef unsigned int size_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
/* MAIN.C */
extern unsigned char *memcpy(unsigned char *dest, const unsigned char *src, int count);
extern unsigned char *memset(unsigned char *dest, unsigned char val, int count);
+1 -1
View File
@@ -15,7 +15,7 @@ objects = obj/start.o \
obj/shell.o \
obj/memorymanager.o \
obj/pci.o \
obj/port.o
obj/port.o \
run:kernel.iso
qemu-system-x86_64 -m 256M -cdrom kernel.iso &
+50 -33
View File
@@ -111,27 +111,17 @@ int string_to_int(char* str)
return sum;
}
//Not working
unsigned char strconcat(unsigned char* dest, unsigned char* src)
{
//char *temp = (char *)dest;
int dest_length = strlen(dest);
int src_length = strlen(src);
unsigned char* buffer = (unsigned char*)Malloc(1024);//dest_length + src_length + 1);
for(uint32_t i = dest_length; i != 0; i--)
{
buffer[i] = dest - i;
puts(dest--);
}
puts("\n");
for(uint32_t j = 0; j < src_length; j++)
{
buffer[j + dest_length - 1] = src + j;
puts(src--);
}
puts("\n");
return buffer;// - (dest_length + src_length + 1);
uint8_t* buffer = Malloc(dest_length + src_length);
unsigned char str = (unsigned char*) *buffer;
memcpy(str, dest, dest_length);
memcpy((str + dest_length), src, src_length + 1);
Free((void*) buffer);
return str;
}
/* We will use this later on for reading from the I/O ports to get data
@@ -214,24 +204,15 @@ extern void main(uint32_t multiboot_magic, const void* multiboot_structure)
puts("Heap size: ");
puts(int_to_string(heap / 1024, 10));
puts(" in kilobytes.\n");
//struct MemoryChunk* allocated = (struct MemoryChunk*) Malloc(2048);
//size_t size = allocated->Next->Size;
//if(First) puts("Yes");
//else puts("no");
puts("First next address: 0x");
puts(int_to_string(First->Next, 16));
//puts("\n");
puts("\nFirst Size: 0x");
puts(int_to_string(First->Size, 16));
puts("\n");
struct MemoryChunk* al = (struct MemoryChunk*) (Malloc(3096) - sizeof(struct MemoryChunk));
puts("AL size: (0x)");
puts(int_to_string(al->Size, 10));
puts("\n");
puts("First next address: 0x");
puts(int_to_string(First->Next, 16));
puts("\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);
idt_install();
puts("Interrupt Descriptor Table initialized.\n");
@@ -253,12 +234,17 @@ extern void main(uint32_t multiboot_magic, const void* multiboot_structure)
puts("Compile Date ");
puts(__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");
//setupstuff();
run_shell();
//puts(&__BUILD_DATE);
//puts(&__BUILD_NUMBER);
@@ -271,3 +257,34 @@ void idle(void)
asm("hlt");
//__asm__ __volatile__ ("hlt");
}
void setupstuff()
{
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 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*/
}
+15 -3
View File
@@ -59,22 +59,34 @@ void* Malloc(size_t size)
freeChunk->Allocated = true;
puts("Address of new chunk: 0x");
puts(int_to_string((size_t)freeChunk + sizeof(struct MemoryChunk), 16));
puts(int_to_string((size_t)freeChunk, 16));
puts("\n");
return (void*)(((size_t) freeChunk) + sizeof(struct MemoryChunk));
}
void Free(void* ptr)
{
struct MemoryChunk* chunk = (struct MemoryChunk*)((size_t) ptr - sizeof(struct MemoryChunk));
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;
if(chunk->Prev != 0 && !chunk->Prev->Allocated)
{
chunk->Prev->Next = chunk->Next;
chunk->Prev->Size += chunk->Size + sizeof(struct MemoryChunk);
if(chunk->Next != 0)
chunk->Next->Prev = chunk->Prev;
}
if(chunk->Next != 0 && !chunk->Next->Allocated)
{
chunk->Size += chunk->Next->Size + sizeof(struct MemoryChunk);
chunk->Next = chunk->Next->Next;
if(chunk->Next != 0)
chunk->Next->Prev = chunk;
}
}
+12
View File
@@ -104,7 +104,19 @@ void execmd()
void proccess_command(char *text)
{
int cmdlets = 0;
int length = strlen(text);
for(int i = 0; i < length; i++)
{
if(text[i] == ' ')
{
puts("Whitespace found!\n");
cmdlets++;
}
}
puts(strconcat("CMDLET count: ", int_to_string(cmdlets, 10)));
unsigned char *commands[cmdlets][length];
return;
int currentArrayIndex = 0;
if(length == 0) return;
unsigned char *array[length];