diff --git a/src/bin/shell/main.c b/src/bin/shell/main.c index fa53cc3..7a4e3cb 100755 --- a/src/bin/shell/main.c +++ b/src/bin/shell/main.c @@ -54,7 +54,7 @@ printf("\nUbixOS v0.01a " __DATE__" " __TIME__ " \n"); if (memcmp(buffer,"exec", 4) == 0) { tmp += 5; - cPid = fork(); + cPid = fork(); if (!cPid) { exec(tmp); } diff --git a/src/sys/include/vmm/memory.h b/src/sys/include/vmm/memory.h index 6fc563e..a579bc0 100755 --- a/src/sys/include/vmm/memory.h +++ b/src/sys/include/vmm/memory.h @@ -24,6 +24,8 @@ #ifndef _MEMORY_H #define _MEMORY_H +#include + #define memAvail 1 #define memNotavail 2 @@ -33,8 +35,8 @@ unsigned short pid; } mMap; -extern int numPages; extern mMap *memoryMap; +extern int numPages; int countMemory(); unsigned long findFreepage(int pid); diff --git a/src/sys/include/vmm/paging.h b/src/sys/include/vmm/paging.h index 2d58fc1..c3ca266 100755 --- a/src/sys/include/vmm/paging.h +++ b/src/sys/include/vmm/paging.h @@ -28,15 +28,18 @@ #define pageLength 0x00000400 #define pageSize 4096 +#define pageEntries (pageSize/4) #define pagePresent 0x00000001 #define pageWrite 0x00000002 #define pageUser 0x00000004 #define pageDefault (pagePresent|pageWrite|pageUser) -extern unsigned long *pageDirectory; -extern unsigned long memoryStart; +extern uLong *kernelPageDirectory; +extern uLong *pageDirectory; +extern uLong memoryStart; -void initPaging(); +//void initPaging(); +void initPagingSystem(); unsigned int allocPage(); void remapPage(uLong source,uLong dest); void pageFault(); diff --git a/src/sys/init/main.c b/src/sys/init/main.c index 57c2930..51f19fa 100755 --- a/src/sys/init/main.c +++ b/src/sys/init/main.c @@ -36,7 +36,6 @@ #include #include -int testVal=0; descriptorTable(GDT,5) { {dummy:0}, @@ -54,7 +53,6 @@ int main(); void _start(void) { - countMemory(); asm( "lgdtl (loadGdt) \n" "movw $0x10,%ax \n" @@ -73,19 +71,25 @@ while(1); } +void testThread() { + kprintf("Test Thread\n"); + while(1); + } + int main() { - clearScreen(); - outputVersion(); //Display Version Info - init8259(); //Initialize PIC - initIdt(); //Initialize IDT - initPaging(); //Initialize Paging System - initMmap(); //Initialize Memory Map - initKeyboard(); //Initialize Keyboard - initScheduler(); //Initialize Scheduler - initFloppy(); //Initialize Floppy Controller - initUbixFS(); + initMmap(); //Initialize Memory Map + clearScreen(); //Clear The Screen + outputVersion(); //Display Version Info + initPagingSystem(); //Initialize Paging System + init8259(); //Initialize PIC + initIdt(); //Initialize IDT + initKeyboard(); //Initialize Keyboard + initScheduler(); //Initialize Scheduler + initFloppy(); //Initialize Floppy Controller + initUbixFS(); //Initialize File System execThread(idleThread,0xAFFF,"Idle Thread"); - execFile("init"); + execThread(testThread,0xBfff,"Test Thread"); + //execFile("init"); Needs To Be ReWriten enableIrq(0); while (1); } diff --git a/src/sys/kernel/exec.c b/src/sys/kernel/exec.c index 7b87dcf..d8856a8 100755 --- a/src/sys/kernel/exec.c +++ b/src/sys/kernel/exec.c @@ -116,7 +116,9 @@ void execThread(void (* tproc)(void),int stack,char *descr) { int pid = 0; - pid = findTask(); + kTask_t * newProcess; + newProcess = findTask(); + pid = newProcess->id; taskList[pid].tss.back_link = 0x0; taskList[pid].tss.esp0 = stack; taskList[pid].tss.ss0 = 0x10; @@ -124,7 +126,7 @@ taskList[pid].tss.ss1 = 0x10; taskList[pid].tss.esp2 = 0x0; taskList[pid].tss.ss2 = 0x10; - taskList[pid].tss.cr3 = (unsigned int)pageDirectory; + taskList[pid].tss.cr3 = (unsigned int)kernelPageDirectory; taskList[pid].tss.eip = (unsigned int)tproc; taskList[pid].tss.eflags = 0x206; taskList[pid].tss.esp = stack; diff --git a/src/sys/kernel/fork.c b/src/sys/kernel/fork.c index bd3754f..251ab75 100755 --- a/src/sys/kernel/fork.c +++ b/src/sys/kernel/fork.c @@ -55,7 +55,7 @@ if (pageTablesrc[x] > 0) { if ((i < 768) && (i>=1)) { pageTabledst[x] = (pageTablesrc[x] & 0xFFFFF000) | (pagePresent|pageUser); - //pageTablesrc[x] = (pageTablesrc[x] & 0xFFFFF000) | (pagePresent|pageUser); + //pageTablesrc[x] = (pageTablesrc[x] & 0xFFFFF000) | (pagePresent|pageUser); } else { pageTabledst[x] = pageTablesrc[x]; diff --git a/src/sys/kernel/idt.c b/src/sys/kernel/idt.c index f9ca366..e867c33 100755 --- a/src/sys/kernel/idt.c +++ b/src/sys/kernel/idt.c @@ -38,7 +38,7 @@ /* Sets Up Initial IDT Table */ void initIdt() { int i=0; - for (i=0;i<256;i++) { + for (i=15;i<256;i++) { setVector(intNull, i, dPresent + dInt + dDpl3); } asm ( diff --git a/src/sys/kernel/kmalloc.c b/src/sys/kernel/kmalloc.c index a273a30..d1c3fe7 100755 --- a/src/sys/kernel/kmalloc.c +++ b/src/sys/kernel/kmalloc.c @@ -41,29 +41,46 @@ struct memDescriptor *tmpDesc = 0x0; kernDesc = (void *)allocPage(); tmpDesc = kernDesc; - for (i=0;i<4096;i+=16) { + for (i=0;i<4096;i+=sizeof(struct memDescriptor)) { tmpDesc->page = 0x0; tmpDesc->base = 0x0; tmpDesc->limit = 0x0; tmpDesc->counter = 0x0; - if (i == 4096) { - tmpDesc->next = 0x0; + if ((i+sizeof(struct memDescriptor)) < 4096) { + tmpDesc->next = (struct memDescriptor *)((uLong)tmpDesc+sizeof(struct memDescriptor)); } else { - tmpDesc->next = tmpDesc+16; + tmpDesc->next = 0x0; } tmpDesc = tmpDesc->next; } } void *findFreeDesc() { - struct memDescriptor *findDesc = 0x0; - for (findDesc=(struct memDescriptor *)kernDesc;findDesc;findDesc=(struct memDescriptor *)findDesc->next) { + int i = 0; + struct memDescriptor *findDesc = 0x0,*tmpDesc = 0x0; + for (findDesc=(struct memDescriptor *)kernDesc;(findDesc != 0x0);findDesc=(struct memDescriptor *)findDesc->next) { if (findDesc->base == 0) { return(findDesc); } + if (findDesc->next == 0) { break; } } - + tmpDesc = (void *)allocPage(); + findDesc->next = tmpDesc; + for (i=0;i<4096;i+=sizeof(struct memDescriptor)) { + tmpDesc->page = 0x0; + tmpDesc->base = 0x0; + tmpDesc->limit = 0x0; + tmpDesc->counter = 0x0; + if ((i+sizeof(struct memDescriptor)) < 4096) { + tmpDesc->next = (struct memDescriptor *)((uLong)tmpDesc+sizeof(struct memDescriptor)); + } + else { + tmpDesc->next = 0x0; + } + tmpDesc = tmpDesc->next; + } + return(findFreeDesc()); return(0); } @@ -72,8 +89,8 @@ struct memDescriptor *tmpDesc = 0x0,*newDesc = 0x0; if (!kernDesc) { initMalloc(); - } - for(tmpDesc=kernDesc;tmpDesc;tmpDesc=tmpDesc->next) { + } + for(tmpDesc=kernDesc;tmpDesc;tmpDesc=tmpDesc->next) { if (tmpDesc->counter == 0) { if (tmpDesc->limit >= len) { if (tmpDesc->limit > len+4) { diff --git a/src/sys/kernel/schedule.c b/src/sys/kernel/schedule.c index a056932..c7235da 100755 --- a/src/sys/kernel/schedule.c +++ b/src/sys/kernel/schedule.c @@ -29,6 +29,7 @@ #include #include #include +#include #ifndef CURRENT_CPU #define CURRENT_CPU 0 @@ -39,7 +40,7 @@ int currentProc = -1; -kTask_t *taskList = (kTask_t *)0xE0000000; +kTask_t *taskList = (kTask_t *)0xE0800000; kTask_t *_current,*_usedMath = 0x0; extern union descriptorTableunion GDT[7]; @@ -58,8 +59,10 @@ /* Initialize Scheduler */ void initScheduler(void) { int i; - remapPage(allocPage(),0xE0000000); - remapPage(allocPage(),(0xE0000000-1)); + for (i=0;i<(sizeof(kTask_t)*1024)/0x1000;i++) { + remapPage(allocPage(),(0xE0800000+(i*0x1000))); + } + remapPage(allocPage(),(0xE0800000-0x1000)); taskList[-1].id = -1; taskList[-1].status = EMPTY; for (i=0;i #include #include +#include int startSector; @@ -44,7 +45,9 @@ kprintf("Insert System Disk\n"); initUbixFS(); } - remapPage(allocPage(),0xECCCC000); + for (i=0;i<(sizeof(struct fileDescriptorTable)*1024)/0x1000;i++) { + remapPage(allocPage(),(0xECCCC000+(i*0x1000))); + } for (i=0;i mMap *memoryMap = (mMap *) 0x100000; -int numPages; +int numPages = 0; int countMemory() { register unsigned long *mem; @@ -90,25 +90,27 @@ /* Return IRQ 1 & 2's States */ outportByte(0x21, irq1State); outportByte(0xA1, irq2State); - numPages = (memKb*1024*1024)/4096; - return(memKb<<20); + return((memKb*1024*1024)/4096); } void initMmap() { int i=0; + numPages = countMemory(); memoryMap = (mMap *) 0x100000; for (i=0;iid); @@ -77,30 +164,40 @@ return(page); } -void remapPage(uLong source,uLong dest) { - uInt spi=0,spage=0,dpi=0,dpage=0; - uLong *srcPagetable,*dstPagetable,*pageDir; +/************************************************************************ - if ((_current->id < 0) || (_current->id > numTasks)) { - pageDir = pageDirectory; - } - else { - pageDir = (long *)_current->tss.cr3; - } - spi = source/(1024*4096); - spage = (source-(spi*(1024*4096)))/4096; - dpi = dest/(1024*4096); - dpage = (dest-(dpi*(1024*4096)))/4096; - srcPagetable = (uLong *)(pageDir[spi]-39); - if (pageDir[dpi] == 0) { - pageDir[dpi] = (uLong)(allocPage()+39); +Function: void remapPage(Physical Source,Virtual Destination) +Description: This Function Will Remap A Physical Page Into Virtual Space +Notes: + +07/29/02 - Rewrote This To Work With Our New Paging System + +************************************************************************/ +void remapPage(uLong source,uLong dest) { + uShort destPageDirectoryIndex=0,destPageTableIndex=0; + uLong *pageDir,*pageTable; +// uInt spi=0,spage=0,dpi=0,dpage=0; +// uLong *srcPagetable,*dstPagetable,*pageDir; + //Set Pointer pageDirectory To Point To The Virtual Mapping Of The Page Directory + pageDir = (uLong *)0xE0400000; + //Check To See If Page Table Exists + destPageDirectoryIndex = (dest/(1024*4096)); + if (pageDir[destPageDirectoryIndex] == 0) { + //If Page Table Is Non Existant Then Set It Up + pageDir[destPageDirectoryIndex] = (uLong)allocPage() | pageDefault; + //Reload Page Directory asm( "movl %cr3,%eax\n" "movl %eax,%cr3\n" ); } - dstPagetable = (uLong *)(pageDir[dpi]-39); - dstPagetable[dpage] = srcPagetable[spage]; + //Set Address To Page Table + pageTable = (uLong *)(0xE0000000 + (4096 * destPageDirectoryIndex)); + //Get The Index To The Page Table + destPageTableIndex = ((dest-(destPageDirectoryIndex*(1024*4096)))/4096); + //Set The Source Address In The Destination + pageTable[destPageTableIndex] = (uLong)(source | pageDefault); + //Reload The Page Table; asm( "movl %cr3,%eax\n" "movl %eax,%cr3\n" @@ -125,7 +222,7 @@ pi = cr2/(1024*4096); page = (cr2-(pi*(1024*4096)))/4096; if (pageDir[pi] == 0) { - kprintf("Dumb Ass You Forgot To Allocate Memory\n"); + kprintf("Dumb Ass You Forgot To Allocate Memory [%i]\n",cr2); while (1); pageTable = (uLong *)allocPage(); pageDir[pi] = (uLong)pageTable | pageDefault; diff --git a/ubixos.kdevprj b/ubixos.kdevprj index fb60777..3cac7b4 100755 --- a/ubixos.kdevprj +++ b/ubixos.kdevprj @@ -719,8 +719,14 @@ install_location= type=SOURCE +[src/sys/ubixfs/Makefile] +dist=true +install=false +install_location= +type=DATA + [src/sys/ubixfs/Makefile.am] -files=src/sys/ubixfs/ubixfs.c,src/sys/ubixfs/file.c +files=src/sys/ubixfs/ubixfs.c,src/sys/ubixfs/file.c,src/sys/ubixfs/Makefile sharedlib_LDFLAGS=-version-info 0:0:1 sharedlib_rootname=ubixfs sub_dirs=