Advertisement
minhkhoi1026

addrspace nachos

Jan 7th, 2022
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.23 KB | None | 0 0
  1. bool
  2. AddrSpace::Load(char *filename) {
  3. NoffHeader noffH;
  4. unsigned int i, size;
  5. OpenFile *executable = kernel->fileSystem->Open(filename);
  6.  
  7. if (executable == NULL) {
  8. DEBUG(dbgFile, "\n Error opening file: " << filename);
  9. return FALSE;
  10. }
  11.  
  12. // read file header
  13. executable->ReadAt((char *)&noffH, sizeof(noffH), 0);
  14. if ((noffH.noffMagic != NOFFMAGIC) &&
  15. (WordToHost(noffH.noffMagic) == NOFFMAGIC))
  16. SwapHeader(&noffH);
  17. ASSERT(noffH.noffMagic == NOFFMAGIC);
  18.  
  19. kernel->addrLock->P();
  20.  
  21. // how big is address space?
  22. #ifdef RDATA
  23. size = noffH.code.size + noffH.readonlyData.size + noffH.initData.size +
  24. noffH.uninitData.size + UserStackSize;
  25. // we need to increase the size
  26. // to leave room for the stack
  27. #else
  28. // how big is address space?
  29. size = noffH.code.size + noffH.initData.size + noffH.uninitData.size + UserStackSize; // we need to increase the size
  30. // to leave room for the stack
  31. #endif
  32. numPages = divRoundUp(size, PageSize);
  33. size = numPages * PageSize;
  34.  
  35. // Check the available memory enough to load new process
  36. if (numPages > kernel->gPhysPageBitMap->NumClear())
  37. {
  38. printf("\nAddrSpace:Load: not enough memory for new process..!");
  39. numPages = 0;
  40. delete executable;
  41. kernel->addrLock->V();
  42. return FALSE;
  43. }
  44.  
  45. // set up the translation page
  46. pageTable = new TranslationEntry[numPages];
  47. for (i = 0; i < numPages; i++)
  48. {
  49. pageTable[i].virtualPage = i;
  50. pageTable[i].physicalPage = kernel->gPhysPageBitMap->FindAndSet();
  51. pageTable[i].valid = TRUE;
  52. pageTable[i].use = FALSE;
  53. pageTable[i].dirty = FALSE;
  54. pageTable[i].readOnly = FALSE;
  55. // init data on main memory
  56. bzero(&(kernel->machine->mainMemory[pageTable[i].physicalPage * PageSize]), PageSize);
  57. }
  58.  
  59. kernel->addrLock->V();
  60.  
  61. // copy code segment into memory
  62. if (noffH.code.size > 0)
  63. {
  64. for (i = 0; i < numPages; i++)
  65. executable->ReadAt(&(kernel->machine->mainMemory[noffH.code.virtualAddr])
  66. + (pageTable[i].physicalPage * PageSize),
  67. PageSize, noffH.code.inFileAddr + (i * PageSize));
  68. }
  69.  
  70. // copy initial data segment into memory
  71. if (noffH.initData.size > 0)
  72. {
  73. for (i = 0; i < numPages; i++)
  74. executable->ReadAt(&(kernel->machine->mainMemory[noffH.initData.virtualAddr])
  75. + (pageTable[i].physicalPage * PageSize),
  76. PageSize, noffH.initData.inFileAddr + (i * PageSize));
  77. }
  78.  
  79. // copy read-only segment into memory
  80. #ifdef RDATA
  81. if (noffH.readonlyData.size > 0)
  82. {
  83. for (i = 0; i < numPages; i++)
  84. executable->ReadAt(&(kernel->machine->mainMemory[noffH.readonlyData.virtualAddr])
  85. + (pageTable[i].physicalPage * PageSize),
  86. PageSize, noffH.readonlyData.inFileAddr + (i * PageSize));
  87. }
  88. #endif
  89.  
  90. delete executable;
  91. return TRUE;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement