MCPcopy Create free account
hub / github.com/YatSenOS/YatSenOS-Tutorial-Volume-1 / exit

Method exit

lab8/src/5/src/kernel/program.cpp:514–565  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

512
513
514void 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}

Callers 1

syscall_exitFunction · 0.45

Calls 5

ceilFunction · 0.50
disableInterruptMethod · 0.45
vaddr2paddrMethod · 0.45
releasePhysicalPagesMethod · 0.45
releasePagesMethod · 0.45

Tested by

no test coverage detected