diff --git a/src/bin/init/main.c b/src/bin/init/main.c index f0a6e8f..602e799 100755 --- a/src/bin/init/main.c +++ b/src/bin/init/main.c @@ -33,7 +33,7 @@ } int main() { - int i=0,pid=10; + int i=0; i = getpid(); printf("This is my pid: [%i]\n",i); for (i=0;i<5;i++) { @@ -41,18 +41,15 @@ } if (getpid() != 1) { printf("Sorry This Program Must Be Started By The Kernel!!!!\n"); - //exit(1); - while (1); + exit(1); } printf("Initializing system.\n"); - //exec("shell"); - if (!fork()) { - while (1) { - printf("I'm The Child!\n"); - } - } - while (1) { - printf("I'm The Parent!\n"); - } +/* if (!fork()) { + printf("I'm The Child\n"); + while(1); + } */ + printf("I'm The Parent!\n"); + exec("shell"); + while (1); exit(1); } \ No newline at end of file diff --git a/src/sys/kernel/exec.c b/src/sys/kernel/exec.c index 946753f..92dd015 100755 --- a/src/sys/kernel/exec.c +++ b/src/sys/kernel/exec.c @@ -52,18 +52,13 @@ pdn[i] = pd[i]; } if (pid > 1) { pdn = pageDirectory; } - kprintf("[%i][%i][%i]\n",pageDirectory,pd,fdTable[0].status); _current = &taskList[pid]; - kprintf("Pd: [%i][%i]\n",*pdn,pdn); asm( "movl %0,%%eax \n" "movl %%eax,%%cr3 \n" : : "d" ((uLong *)(pdn)) ); - kprintf("Pd: [%i][%i]\n",*pdn,pdn); - kprintf("[%i][%i][%i]\n",pageDirectory,pd,fdTable[0].status); fd = fopen(file,1); - //if (_current->id > 1) { while (1); } for (i=0;feof(fd) == 0;i++) { binarySpace[i] = fgetc(fd); } @@ -101,13 +96,11 @@ taskList[pid].tss.ldt = 0x18; taskList[pid].tss.trace_bitmap = 0x80000000; taskList[pid].status = RUNABLE; - kprintf("Done"); asm( "movl %0,%%eax \n" "movl %%eax,%%cr3 \n" : : "d" ((uLong *)(pd)) ); - kprintf("!\n"); } void execThread(void (* tproc)(void),int stack,char *descr) { diff --git a/src/sys/kernel/fork.c b/src/sys/kernel/fork.c index 153ab36..33ea3db 100755 --- a/src/sys/kernel/fork.c +++ b/src/sys/kernel/fork.c @@ -34,16 +34,14 @@ uLong *pageDirsrc,*pageTablesrc,*pageDirdst,*pageTabledst; pid_t cPid = findTask(); //Find An Empty Task schedule(); - src = &_current->tss; - dst = &taskList[cPid].tss; + src = (uChar *)&_current->tss; + dst = (uChar *)&taskList[cPid].tss; for (i=0;itss.cr3; pageDirdst = (uLong *)allocPage(); - //taskList[cPid].tss.cr3 = pageDirdst; for (i=0;i<1024;i++) { if (pageDirsrc[i] > 0) { pageTablesrc = (uLong *)(pageDirsrc[i] & 0xFFFFF000); @@ -56,11 +54,11 @@ pageTabledst[x] = pageTablesrc[x]; } else { */ - pageTabledst[x] = (pageTablesrc[x] & 0xFFFFFFBD);//(pageTablesrc[x] & 0xFFFFF000) | (pagePresent|pageUser);// & 0xFFFFFFD; - if ((pageTablesrc[x] & 0xFFF) == 103) { + pageTabledst[x] = (pageTablesrc[x] & 0xFFFFF000) | (pagePresent|pageUser);// & 0xFFFFFFD; + /* if ((pageTablesrc[x] & 0xFFF) == 103) { kprintf("[%i]",pageTablesrc[x]); pageTabledst[x] = pageTablesrc[x]; - } + }*/ // } } else { @@ -72,10 +70,6 @@ pageDirdst[i] = 0x0; } } - kprintf("Changing Page Dirs"); - kprintf("Pid-Eh: [%i]\n",cPid); - kprintf("[%i][%i]\n",_current->status,taskList[cPid].status); - //taskList[cPid].status = ACTIVE; if (_current->id == cPid) { return(0); } @@ -84,29 +78,6 @@ } } -pid_t testFork(int nr,long ebp,long edi,long esi,long gs,long none, - long ebx,long ecx,long edx, - long fs,long es,long ds, - long cs,long eflags,long esp,long ss) { - kprintf("nr: [%i]\n",nr); - kprintf("ebp: [%i]\n",ebp); - kprintf("edi: [%i]\n",edi); - kprintf("esi: [%i]\n",esi); - kprintf("gs: [%i]\n",gs); - kprintf("none: [%i]\n",none); - kprintf("ebx: [%i]\n",ebx); - kprintf("ecx: [%i]\n",ecx); - kprintf("edx: [%i]\n",edx); - kprintf("fs: [%i]\n",fs); - kprintf("es: [%i]\n",es); - kprintf("ds: [%i]\n",ds); - kprintf("cs: [%i]\n",cs); - kprintf("eflags: [%i]\n",eflags); - kprintf("esp: [%i]\n",esp); - kprintf("ss: [%i]\n",ss); - return(-1); - } - void sysFork() { pid_t cPid = findTask(); uLong *pageDirsrc,*pageTablesrc,*stackSrc,*pageDirdst,*pageTabledst,*stackDst; @@ -114,8 +85,8 @@ uChar *src,*dst; asm("":"=b" (ret)); schedule(); - src = &_current->tss; - dst = &taskList[cPid].tss; + src = (uChar *)&_current->tss; + dst = (uChar *)&taskList[cPid].tss; for (i=0;itss.cr3; pageDirdst = (uLong *)allocPage(); - taskList[cPid].tss.cr3 = pageDirdst; + taskList[cPid].tss.cr3 = (long)pageDirdst; for (i=0;i<1024;i++) { if (pageDirsrc[i] > 0) { pageTablesrc = (uLong *)(pageDirsrc[i] & 0xFFFFF000); @@ -131,10 +102,13 @@ pageTabledst = (uLong *)(pageDirdst[i] & 0xFFFFF000); for (x=0;x<1024;x++) { if (pageTablesrc[x] > 0) { - pageTabledst[x] = pageTablesrc[x]; //(pageTablesrc[x] & 0xFFFFFFBD);//(pageTablesrc[x] & 0xFFFFF000) | (pagePresent|pageUser);// & 0xFFFFFFD; + if ((i == 1) && (x > 4097)) { + pageTabledst[x] = (pageTablesrc[x] & 0xFFFFF000) | (pagePresent|pageUser); + } + else { + pageTabledst[x] = pageTablesrc[x]; + } if ((pageTablesrc[x] & 0xFFF) == 103) { - kprintf("[%i]",pageTablesrc[x]); - pageTabledst[x] = pageTablesrc[x]; } } else { @@ -155,21 +129,14 @@ for (i=0;i<1024;i++) { stackDst[i] = stackSrc[i]; } - kprintf("Stack: [%i]\n",(_current->tss.esp & 0xFFFFF000)+0x1000); - kprintf("Changing Page Dirs"); schedule(); taskList[cPid].tss.eip = _current->tss.eip; taskList[cPid].status = ACTIVE; -// taskList[cPid].tss.eip = &&retHere; -// retHere: - kprintf("[%i][%i][%i]\n",ret,cPid,_current->id); if (_current->id == cPid) { ret[0] = 0; - //asm("movl $0,%ebx"); } else { ret[0] = cPid; - //asm("movl %0,%%ebx"::"g" (cPid)); } } diff --git a/src/sys/kernel/idlethread.c b/src/sys/kernel/idlethread.c index 1675ebe..dd4d503 100755 --- a/src/sys/kernel/idlethread.c +++ b/src/sys/kernel/idlethread.c @@ -27,22 +27,9 @@ #include void idleThread() { - pid_t pid; - /*asm( - "mov $4,%%eax\n" - "int %0\n" - : - : "i" (0x80) - ); - asm("": "=b" (pid)); */ while (1); -/* if (_sysFork()) { - while (1) { - kprintf("A"); - } - } while (1) { - kprintf("B"); */ + kprintf("B"); //checkTasks(); /* Looks for run away proccesses and kills thems */ -// } + } } diff --git a/src/sys/kernel/idt.c b/src/sys/kernel/idt.c index adc02dd..3e3f885 100755 --- a/src/sys/kernel/idt.c +++ b/src/sys/kernel/idt.c @@ -57,7 +57,7 @@ setVector(_int4,4,dPresent + dInt + dDpl3); setVector(_int5,5,dPresent + dInt + dDpl3); setVector(_int6,6,dPresent + dInt + dDpl3); - setVector(_sysCall,128,dPresent + dInt + dDpl1); + setVector(_sysCall,128,dPresent + dInt + dDpl3); } /* Sets Up IDT Vector */ diff --git a/src/sys/kernel/syscall.c b/src/sys/kernel/syscall.c index 62ab638..eee982f 100755 --- a/src/sys/kernel/syscall.c +++ b/src/sys/kernel/syscall.c @@ -26,8 +26,10 @@ #include #include #include +#include #include #include +#include asm( ".globl _sysCall \n" @@ -78,10 +80,29 @@ } void sysExec() { + int fd=0,i=0,x=0,eStart=0,pid; + char *binarySpace = (char *)0x7C0000; + char *newLoc; char *file; - asm("":"=b" (file)); - asm("sti"); - disableIrq(0); - execFile(file); - enableIrq(0); + elfHeader *binaryHeader = (elfHeader *)0x7C0000; + elfProgramheader *programHeader; + asm("":"=b"(file)); + kprintf("[%s][%i]\n",file,fdTable[0].status); + fd = fopen(file,1); + while(1); + for (i=0;feof(fd) == 0;i++) { + binarySpace[i] = fgetc(fd); + } + programHeader = (elfProgramheader *)(0x7C0000 + binaryHeader->ePhoff); + newLoc = (char *)programHeader->phVaddr; + for (x=0;xeEntry; + newLoc = (char *)0x5DC000; + for (i=0;i<4096;i++) { + newLoc[i] = 0x0; + } + taskList[pid].tss.eip = (long)eStart; + kprintf("!\n"); } diff --git a/src/sys/ubixfs/file.c b/src/sys/ubixfs/file.c index 2c5f160..0c35c3e 100755 --- a/src/sys/ubixfs/file.c +++ b/src/sys/ubixfs/file.c @@ -23,7 +23,6 @@ #include #include -#include struct fileDescriptorTable *fdTable = (struct fileDescriptorTable *)0xECCCC000; @@ -44,11 +43,11 @@ } int fopen(const char *file,int mode) { - int i=0; + int i=0,err=0; for (i=0;i #include #include +#include int startSector; @@ -87,6 +88,7 @@ return(ch); } + int findFile(char *file,struct fileDescriptorTable *head) { int i=0; struct fileTableEntry *ft; diff --git a/src/sys/vmm/paging.c b/src/sys/vmm/paging.c index 9c4d2ce..fa79a03 100755 --- a/src/sys/vmm/paging.c +++ b/src/sys/vmm/paging.c @@ -110,6 +110,7 @@ void pageFault() { uLong cr2 = 0,i = 0, page = 0,pi = 0; uLong *pageDir,*pageTable; + uChar *src,*dst; if ((_current->id < 0) || (_current->id > numTasks)) { pageDir = pageDirectory; } @@ -132,11 +133,14 @@ pageTable[page] = allocPage() | pageDefault; } else { - pageTable = (uLong *)(pageDir[pi]-39); + pageTable = (uLong *)(pageDir[pi] & 0xFFFFF000); if (pageTable[page] > 0) { - kprintf("Woot"); - //pageTable[page] = (pageTable[page] & 0xFFFFF000) | pageDefault; - while (1); + src = (uChar *) (pageTable[page] & 0xFFFFF000); + pageTable[page] = allocPage() | pageDefault; + dst = (uChar *) (pageTable[page] & 0xFFFFF000); + for (i=0;i<4096;i++) { + dst[i] = src[i]; + } } else { pageTable[page] = allocPage() | pageDefault;