diff --git a/Functions.c b/Functions.c index 63ed44f..385c861 100644 --- a/Functions.c +++ b/Functions.c @@ -38,6 +38,13 @@ inline void disable_ints() asm("cli"); }; + +char *strcat(char *dest, char *src) +{ + strcpy(dest+strlen(dest), src); +} + + //Re-maps the Programmable Interrupr Controllers so IRQ0->pic1 base address, IRG8->pic2 base address void remap_pics(int pic1, int pic2) { @@ -108,13 +115,6 @@ inline void init_timer() outportb(0x40, 0x2e); //msb } - -//Invalidates the page tables to re-cache the Translation Lookaside Buffer -/*inline void invlpg() -{ - asm("invlpg"); -}*/ - //Signals an End Of Interrupt signal to the first PIC inline void eoi() { diff --git a/asmfuncs.asm b/asmfuncs.asm index f955994..431022b 100644 --- a/asmfuncs.asm +++ b/asmfuncs.asm @@ -52,6 +52,70 @@ _read_cr3: mov eax, cr3; ret +;copies a string from the source to the destination parameter +;extern void strcpy(char *dest, char *src); +[global _strcpy] +_strcpy: + push ebp + mov ebp, esp + push esi + push edi + mov edi, [ebp+8] + mov esi, [ebp+12] +strcpyloop: + lodsb + stosb + or al, al + jnz strcpyloop + pop edi + pop esi + pop ebp + ret + +;copies memory of n bytes from src to destination +;extern void memcpy(dword dest, dword src, dword n); +[global _memcpy] +_memcpy: + push ebp + mov ebp, esp + push esi + push edi + push ecx + mov edi, [ebp+8] + mov esi, [ebp+12] + mov ecx, [ebp+16] + + rep movsb + + pop ecx + pop edi + pop esi + pop ebp + ret + +;returns the number of characters in a string +;extern dword strlen(char *str); +[global _strlen] +_strlen: + push ebp + mov ebp, esp + push esi + push ebx + mov esi, [ebp+8] + xor ebx, ebx +strlenloop: + lodsb + or al, al + jz strlendone + inc ebx + jmp strlenloop +strlendone: + mov eax, ebx + pop ebx + pop esi + pop ebp + ret + ;this function invalidates the page directory/table entry that ; would be used to access the memory address given in the parameter ;extern void invlpg(dword addr); diff --git a/functions.h b/functions.h index 0dd0bd5..a437541 100644 --- a/functions.h +++ b/functions.h @@ -21,8 +21,7 @@ inline void eoi(); inline void eoi2(); inline dword kernel_size(); inline void init_timer(); -//inline void invlpg(); - +char *strcat(char *dest, char *src); diff --git a/gccasm.bat b/gccasm.bat new file mode 100755 index 0000000..1a2b65b --- /dev/null +++ b/gccasm.bat @@ -0,0 +1 @@ +gcc -S kernel.c -masm=intel -fno-builtin diff --git a/kernel.c b/kernel.c index 60632cf..6b240fe 100644 --- a/kernel.c +++ b/kernel.c @@ -16,6 +16,8 @@ #include "fdc.h" //Floppy Disk Controller functions #include "stdfont.h" //Standard font bitmask array #include "kio.h" +#include "vfs.h" +#include "rd.h" void isr(dword num); void k_init(); @@ -32,7 +34,12 @@ extern void console_cls(); extern int puts(char *str); extern int putDec(int number); extern int putDecu(dword number); +extern void strcpy(char *dest, char *src); +extern void memcpy(dword dest, dword src, dword n); +extern dword strlen(char *str); +#include "rd.c" +#include "vfs.c" #include "kio.c" #include "fdc.c" #include "mouse.c" @@ -58,6 +65,7 @@ void k_init() mouse_init(); pic1_mask(0); //unmask IRQ's 0-7 pic2_mask(0); //unmask IRQ's 8-15 + vfs_init(); enable_ints(); kbd_resetLEDs(); //after enabling interrupts!! if (videoMode) @@ -71,6 +79,7 @@ void k_init() printf("HOS 0.13 - Kernel File Size: %u kb\tData Size: %u bytes\n", kernel_size()>>10, (dword)(&_end)-(dword)(&_code)); printf("Memory available to OS: %u MB (%u bytes)\n", mm_megabytes, mm_totalmem); printf("Free memory: %u bytes (%u pages)\n", mm_freemem(), mm_freemem()>>12); + printf("Root Directory: %s/\n", rootDirectory); dword key = 0; for (;;) diff --git a/rd.c b/rd.c new file mode 100644 index 0000000..1b63060 --- /dev/null +++ b/rd.c @@ -0,0 +1,13 @@ +// rd.c +// Author: Josh Holtrop +// Created: 12/31/03 + + +byte *rd_readSector(DiskDevice *rd, dword sector) +{ + dword dest = (dword)malloc(512); + memcpy(dest, rd->location + (sector * 512), 512); +} + + + diff --git a/rd.h b/rd.h new file mode 100644 index 0000000..4ec8c2d --- /dev/null +++ b/rd.h @@ -0,0 +1,8 @@ +// rd.h +// Author: Josh Holtrop +// Created: 12/31/03 + + +byte *rd_readSector(DiskDevice *rd, dword sector); + + diff --git a/vfs.c b/vfs.c index e69de29..579b2b5 100644 --- a/vfs.c +++ b/vfs.c @@ -0,0 +1,71 @@ +// vfs.c +// Author: Josh Holtrop +// Created: 12/31/03 + + +void vfs_init() +{ + byte ramDiskPresent = *(byte *)0xC0090000; + if (ramDiskPresent) + { + strcpy(rootDirectory, "rd0"); + firstDevice = malloc(sizeof(DeviceEntry)); + firstDevice->link = 0; + firstDevice->diskDevice = malloc(sizeof(DiskDevice)); + firstDevice->diskDevice->type = VFS_DISK_RD; + firstDevice->diskDevice->fileSystem = VFS_FS_FAT12; + strcpy(firstDevice->diskDevice->id, "rd0"); + firstDevice->diskDevice->location = 0xC0200000; + } + else + { + rootDirectory[0] = 0; + } +} + + +byte *vfs_readFile(char *fileName) +{ + char *newFileName = fileName; + char device[4]; + if (fileName[0] == '/') + { + newFileName = malloc(strlen(fileName)+4); + strcpy(newFileName, rootDirectory); + strcat(newFileName, fileName); + } + strcpy(device, newFileName); + DiskDevice *dd = vfs_getDiskDeviceByID(device); + + if (newFileName != fileName) + free(newFileName); +} + + +byte *vfs_readSector(DiskDevice *dd, dword sector) +{ + switch(dd->type) + { + case VFS_DISK_RD: + return rd_readSector(dd, sector); + } + return 0; +} + + +DiskDevice *vfs_getDiskDeviceByID(char *id) +{ + DeviceEntry *de = firstDevice; + for (;;) + { + if (strcmp(de->diskDevice->id, id)) + return de->diskDevice; + de = (DeviceEntry *)de->link; + if (!de) + break; + } + return 0; +} + + + diff --git a/vfs.h b/vfs.h index e69de29..cf401a8 100644 --- a/vfs.h +++ b/vfs.h @@ -0,0 +1,34 @@ +// vfs.h +// Author: Josh Holtrop +// Created: 12/31/03 + + +#define VFS_DISK_RD 1 +#define VFS_DISK_FD 2 +#define VFS_DISK_HD 3 + +#define VFS_FS_FAT12 1 + + +typedef struct { + dword type; + dword fileSystem; + char id[4]; + dword location; +} __attribute__((packed)) DiskDevice; + +typedef struct { + DiskDevice *diskDevice; + dword link; +} __attribute__((packed)) DeviceEntry; + + +void vfs_init(); +byte *vfs_readFile(char *fileName); +byte *vfs_readSector(DiskDevice *dd, dword sector); +DiskDevice *vfs_getDiskDeviceByID(char *id); + +char rootDirectory[4]; +DeviceEntry *firstDevice = 0; + +