| 512 | |
| 513 | |
| 514 | void ProgramManager::exit(int ret) |
| 515 | { |
| 516 | // 关中断 |
| 517 | interruptManager.disableInterrupt(); |
| 518 | |
| 519 | // 第一步,标记PCB状态为`DEAD`并放入返回值。 |
| 520 | PCB *program = this->running; |
| 521 | program->retValue = ret; |
| 522 | program->status = ProgramStatus::DEAD; |
| 523 | |
| 524 | int *pageDir, *page; |
| 525 | int paddr; |
| 526 | |
| 527 | // 第二步,如果PCB标识的是进程,则释放进程所占用的物理页、页表、页目录表和虚拟地址池bitmap的空间。 |
| 528 | if (program->pageDirectoryAddress) |
| 529 | { |
| 530 | pageDir = (int *)program->pageDirectoryAddress; |
| 531 | for (int i = 0; i < 768; ++i) |
| 532 | { |
| 533 | if (!(pageDir[i] & 0x1)) |
| 534 | { |
| 535 | continue; |
| 536 | } |
| 537 | |
| 538 | page = (int *)(0xffc00000 + (i << 12)); |
| 539 | |
| 540 | for (int j = 0; j < 1024; ++j) |
| 541 | { |
| 542 | if(!(page[j] & 0x1)) { |
| 543 | continue; |
| 544 | } |
| 545 | |
| 546 | paddr = memoryManager.vaddr2paddr((i << 22) + (j << 12)); |
| 547 | memoryManager.releasePhysicalPages(AddressPoolType::USER, paddr, 1); |
| 548 | } |
| 549 | |
| 550 | paddr = memoryManager.vaddr2paddr((int)page); |
| 551 | memoryManager.releasePhysicalPages(AddressPoolType::USER, paddr, 1); |
| 552 | } |
| 553 | |
| 554 | memoryManager.releasePages(AddressPoolType::KERNEL, (int)pageDir, 1); |
| 555 | |
| 556 | int bitmapBytes = ceil(program->userVirtual.resources.length, 8); |
| 557 | int bitmapPages = ceil(bitmapBytes, PAGE_SIZE); |
| 558 | |
| 559 | memoryManager.releasePages(AddressPoolType::KERNEL, (int)program->userVirtual.resources.bitmap, bitmapPages); |
| 560 | |
| 561 | } |
| 562 | |
| 563 | // 第三步,立即执行线程/进程调度。 |
| 564 | schedule(); |
| 565 | } |
no test coverage detected