diff --git a/src/sys/include/ubixfs/file.h b/src/sys/include/ubixfs/file.h index 6671ec1..0142921 100755 --- a/src/sys/include/ubixfs/file.h +++ b/src/sys/include/ubixfs/file.h @@ -32,19 +32,20 @@ #define fdRead 3 #define fdEof 4 -struct fileDescriptorTable { - uShort id; - uShort status; - uShort mode; - uShort offset; - uLong size; - uShort length; - uLong start; - uChar fileName[22]; - uChar buffer[512]; +struct fileDescriptor { + struct fileDescriptor *next; + uShort id; + uShort status; + uShort mode; + uShort offset; + uLong size; + uShort length; + uLong start; + uChar fileName[22]; + uChar buffer[512]; }; -extern struct fileDescriptorTable *fdTable; +extern struct fileDescriptor *fdTable; int fopen(const char *file,int mode); int fclose(int fd); diff --git a/src/sys/include/ubixfs/ubixfs.h b/src/sys/include/ubixfs/ubixfs.h index d156ae8..67b011f 100755 --- a/src/sys/include/ubixfs/ubixfs.h +++ b/src/sys/include/ubixfs/ubixfs.h @@ -51,9 +51,9 @@ }; void initUbixFS(); -int findFile(char *file,int i); +int findFile(char *file,struct fileDescriptor *fd); int readFile(char *file); -int getFileByte(int fd,int offset); +int getFileByte(struct fileDescriptor *fd,int offset); extern int startSector; diff --git a/src/sys/init/main.c b/src/sys/init/main.c index 51f19fa..2602ec3 100755 --- a/src/sys/init/main.c +++ b/src/sys/init/main.c @@ -77,6 +77,7 @@ } int main() { + int ch,fd = -1; initMmap(); //Initialize Memory Map clearScreen(); //Clear The Screen outputVersion(); //Display Version Info @@ -87,6 +88,11 @@ initScheduler(); //Initialize Scheduler initFloppy(); //Initialize Floppy Controller initUbixFS(); //Initialize File System + fd = fopen("shell",1); + while (!feof(fd)) { + ch = fgetc(fd); + kprintf("[%i]",ch); + } execThread(idleThread,0xAFFF,"Idle Thread"); execThread(testThread,0xBfff,"Test Thread"); //execFile("init"); Needs To Be ReWriten diff --git a/src/sys/kernel/kmalloc.c b/src/sys/kernel/kmalloc.c index d1c3fe7..3e9e4c5 100755 --- a/src/sys/kernel/kmalloc.c +++ b/src/sys/kernel/kmalloc.c @@ -39,7 +39,7 @@ void initMalloc() { int i = 0; struct memDescriptor *tmpDesc = 0x0; - kernDesc = (void *)allocPage(); + kernDesc = (void *)getFreePage(); tmpDesc = kernDesc; for (i=0;i<4096;i+=sizeof(struct memDescriptor)) { tmpDesc->page = 0x0; @@ -65,7 +65,7 @@ } if (findDesc->next == 0) { break; } } - tmpDesc = (void *)allocPage(); + tmpDesc = (void *)getFreePage(); findDesc->next = tmpDesc; for (i=0;i<4096;i+=sizeof(struct memDescriptor)) { tmpDesc->page = 0x0; @@ -102,7 +102,7 @@ break; } if (tmpDesc->page == 0x0) { - tmpDesc->page = (void *)allocPage(); + tmpDesc->page = (void *)getFreePage(); tmpDesc->base = tmpDesc->page; tmpDesc->limit = len; tmpDesc->counter = 1; diff --git a/src/sys/ubixfs/file.c b/src/sys/ubixfs/file.c index aad940b..b6900c1 100755 --- a/src/sys/ubixfs/file.c +++ b/src/sys/ubixfs/file.c @@ -25,35 +25,48 @@ #include #include -struct fileDescriptorTable *fdTable = (struct fileDescriptorTable *)0xECCCC000; +struct fileDescriptor *fdTable = 0x0; int sprintf(char *buf,const char *fmt, ...); int fclose(int fd) { - fdTable[fd].status = fdAvail; + struct fileDescriptor *tmpFd; + for (tmpFd=fdTable;tmpFd;tmpFd=tmpFd->next) { + if (tmpFd->id == fd) { + tmpFd->status = fdAvail; + break; + } + } return(0); } int feof(int fd) { - if (fdTable[fd].status == fdEof) { - return(-1); + struct fileDescriptor *tmpFd; + for (tmpFd=fdTable;tmpFd;tmpFd=tmpFd->next) { + if (tmpFd->id == fd) { + if (tmpFd->status == fdEof) { + return(-1); + } + else { + return(0); + } + } } - else { - return(0); - } + return(0); } int fopen(const char *file,int mode) { - int i=0,ret; - for (i=0;inext) { + if (tmpFdTable->status == fdAvail) { + sprintf(tmpFdTable->fileName,"%s",file); + ret = findFile((char *)file,tmpFdTable); if (ret == 1) { - fdTable[i].mode = mode; - fdTable[i].status = fdOpen; - fdTable[i].offset = 0; - return(i); + tmpFdTable->mode = mode; + tmpFdTable->status = fdOpen; + tmpFdTable->offset = 0; + return(tmpFdTable->id); } else { return((int)-1); } } @@ -63,7 +76,13 @@ int fgetc(int fd) { int ch = 0; - ch = getFileByte(fd,fdTable[fd].offset); - fdTable[fd].offset++; - return(ch); + struct fileDescriptor *tmpFd = 0x0; + for (tmpFd=fdTable;tmpFd;tmpFd=tmpFd->next) { + if (tmpFd->id == fd) { + ch = getFileByte(tmpFd,tmpFd->offset); + tmpFd->offset++; + return(ch); + } + } + return(0x0); } \ No newline at end of file diff --git a/src/sys/ubixfs/ubixfs.c b/src/sys/ubixfs/ubixfs.c index e455b3a..e439229 100755 --- a/src/sys/ubixfs/ubixfs.c +++ b/src/sys/ubixfs/ubixfs.c @@ -33,7 +33,8 @@ void initUbixFS() { int i=0; - struct bootSect *bs; + struct bootSect *bs = 0x0; + struct fileDescriptor *tmpFdTable = 0x0; char data[512]; readBlock(0,data,1); bs = (void *)data; @@ -45,11 +46,18 @@ kprintf("Insert System Disk\n"); initUbixFS(); } - for (i=0;i<(sizeof(struct fileDescriptorTable)*1024)/0x1000;i++) { - remapPage(allocPage(),(0xECCCC000+(i*0x1000))); - } + fdTable = kmalloc(sizeof(struct fileDescriptor)); + tmpFdTable = fdTable; for (i=0;istatus = fdAvail; + tmpFdTable->id = i; + if (i+1 == maxFd) { + tmpFdTable->next = 0x0; + } + else { + tmpFdTable->next = kmalloc(sizeof(struct fileDescriptor)); + } + tmpFdTable = tmpFdTable->next; } } @@ -73,27 +81,27 @@ return(0); } -int getFileByte(int fd,int offset) { +int getFileByte(struct fileDescriptor *fd,int offset) { int ch=0,mp=0; mp = offset/512; - if ((offset%512 == 0) && (fdTable[fd].status == fdRead)) { - fdTable[fd].status = fdOpen; + if ((offset%512 == 0) && (fd->status == fdRead)) { + fd->status = fdOpen; } - if (offset < fdTable[fd].size) { - if (fdTable[fd].status != fdRead) { - readBlock(fdTable[fd].start+mp,fdTable[fd].buffer,1); - fdTable[fd].status = fdRead; + if (offset < fd->size) { + if (fd->status != fdRead) { + readBlock(fd->start+mp,fd->buffer,1); + fd->status = fdRead; } - ch = fdTable[fd].buffer[offset-(mp*512)]; + ch = fd->buffer[offset-(mp*512)]; } else { ch = -1; - fdTable[fd].status = fdEof; + fd->status = fdEof; } return(ch); } -int findFile(char *file,int i) { +int findFile(char *file,struct fileDescriptor *fd) { int x=0; bool ret = TRUE; struct fileTableEntry *ft; @@ -102,9 +110,9 @@ ft = (void *)data; for (x=0;x<128;x++) { if ((int)!kstrcmp(ft[x].fileName,file)) { - fdTable[i].start = ft[x].start; - fdTable[i].length = ft[x].length; - fdTable[i].size = ft[x].size; + fd->start = ft[x].start; + fd->length = ft[x].length; + fd->size = ft[x].size; kfree(data); return((int)1); } diff --git a/src/sys/vmm/paging.c b/src/sys/vmm/paging.c index 65ef2d9..ab1b81a 100755 --- a/src/sys/vmm/paging.c +++ b/src/sys/vmm/paging.c @@ -103,19 +103,34 @@ memoryMap = (mMap *)0xE6667000; } +/************************************************************************ + +Function: void *getFreePage(); +Description: Returns A Free Page Mapped To The VM Space +Notes: + +07/30/02 - This Returns A Free Page In The Top 1GB For The Kernel + +************************************************************************/ void *getFreePage() { - short x=0,y=0; + int x=0,y=0; uLong *pageTableSrc = 0x0; - for (x=896;x<1024;x++) { - pageTableSrc = (uLong *)(pageDirectory[x] & 0xFFFFF000); + //Lets Search For A Free Page + for (x=768;x<1024;x++) { + //Set Page Table Address + pageTableSrc = (uLong *)(0xBFC00000 + (4096*x)); for (y=0;y<1024;y++) { - if (pageTableSrc[y] == 0) { - kprintf("found One: [%i][%i], Addr: (%i)\n",x,y,((x*(1024*4096))+(y*4096))); - while(1); + //Loop Through The Page Table Find An UnAllocated Page + if ((uLong)pageTableSrc[y] == (uLong)0x0) { + //Map A Physical Page To The Virtual Page + remapPage(allocPage(),((x*(1024*4096))+(y*4096))); + //Return The Address Of The Newly Allocate Page + return(((x*(1024*4096))+(y*4096))); } } } - return(0x0); + //If No Free Page Was Found Return NULL + return(0x0); } unsigned int allocPage() { uLong page;