Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool
- AddrSpace::Load(char *filename) {
- NoffHeader noffH;
- unsigned int i, size;
- OpenFile *executable = kernel->fileSystem->Open(filename);
- if (executable == NULL) {
- DEBUG(dbgFile, "\n Error opening file: " << filename);
- return FALSE;
- }
- // read file header
- executable->ReadAt((char *)&noffH, sizeof(noffH), 0);
- if ((noffH.noffMagic != NOFFMAGIC) &&
- (WordToHost(noffH.noffMagic) == NOFFMAGIC))
- SwapHeader(&noffH);
- ASSERT(noffH.noffMagic == NOFFMAGIC);
- kernel->addrLock->P();
- // how big is address space?
- #ifdef RDATA
- size = noffH.code.size + noffH.readonlyData.size + noffH.initData.size +
- noffH.uninitData.size + UserStackSize;
- // we need to increase the size
- // to leave room for the stack
- #else
- // how big is address space?
- size = noffH.code.size + noffH.initData.size + noffH.uninitData.size + UserStackSize; // we need to increase the size
- // to leave room for the stack
- #endif
- numPages = divRoundUp(size, PageSize);
- size = numPages * PageSize;
- // Check the available memory enough to load new process
- if (numPages > kernel->gPhysPageBitMap->NumClear())
- {
- printf("\nAddrSpace:Load: not enough memory for new process..!");
- numPages = 0;
- delete executable;
- kernel->addrLock->V();
- return FALSE;
- }
- // set up the translation page
- pageTable = new TranslationEntry[numPages];
- for (i = 0; i < numPages; i++)
- {
- pageTable[i].virtualPage = i;
- pageTable[i].physicalPage = kernel->gPhysPageBitMap->FindAndSet();
- pageTable[i].valid = TRUE;
- pageTable[i].use = FALSE;
- pageTable[i].dirty = FALSE;
- pageTable[i].readOnly = FALSE;
- // init data on main memory
- bzero(&(kernel->machine->mainMemory[pageTable[i].physicalPage * PageSize]), PageSize);
- }
- kernel->addrLock->V();
- // copy code segment into memory
- if (noffH.code.size > 0)
- {
- for (i = 0; i < numPages; i++)
- executable->ReadAt(&(kernel->machine->mainMemory[noffH.code.virtualAddr])
- + (pageTable[i].physicalPage * PageSize),
- PageSize, noffH.code.inFileAddr + (i * PageSize));
- }
- // copy initial data segment into memory
- if (noffH.initData.size > 0)
- {
- for (i = 0; i < numPages; i++)
- executable->ReadAt(&(kernel->machine->mainMemory[noffH.initData.virtualAddr])
- + (pageTable[i].physicalPage * PageSize),
- PageSize, noffH.initData.inFileAddr + (i * PageSize));
- }
- // copy read-only segment into memory
- #ifdef RDATA
- if (noffH.readonlyData.size > 0)
- {
- for (i = 0; i < numPages; i++)
- executable->ReadAt(&(kernel->machine->mainMemory[noffH.readonlyData.virtualAddr])
- + (pageTable[i].physicalPage * PageSize),
- PageSize, noffH.readonlyData.inFileAddr + (i * PageSize));
- }
- #endif
- delete executable;
- return TRUE;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement