[Zion] Free paging structures after process exit.
This commit is contained in:
parent
39ac0216dd
commit
46ae5de30a
|
@ -87,6 +87,21 @@ uint64_t CurrCr3() {
|
||||||
return pml4_addr;
|
return pml4_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CleanupPageStructure(uint64_t struct_phys, uint64_t level) {
|
||||||
|
uint64_t* struct_virtual =
|
||||||
|
reinterpret_cast<uint64_t*>(boot::GetHigherHalfDirectMap() + struct_phys);
|
||||||
|
|
||||||
|
if (level > 0) {
|
||||||
|
for (uint16_t i = 0; i < 256; i++) {
|
||||||
|
if (struct_virtual[i] & PRESENT_BIT) {
|
||||||
|
CleanupPageStructure(struct_virtual[i] & ~0xFFF, level - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
phys_mem::FreePage(struct_phys);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
void InitializePml4(uint64_t pml4_physical_addr) {
|
void InitializePml4(uint64_t pml4_physical_addr) {
|
||||||
|
@ -105,6 +120,20 @@ void InitializePml4(uint64_t pml4_physical_addr) {
|
||||||
pml4_virtual[Pml4Index(hhdm)] = *Pml4Entry(curr_cr3, hhdm);
|
pml4_virtual[Pml4Index(hhdm)] = *Pml4Entry(curr_cr3, hhdm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CleanupPml4(uint64_t pml4_physical_addr) {
|
||||||
|
uint64_t* pml4_virtual = reinterpret_cast<uint64_t*>(
|
||||||
|
boot::GetHigherHalfDirectMap() + pml4_physical_addr);
|
||||||
|
|
||||||
|
// Iterate the first half of the pml4 as it contains user-space mappings.
|
||||||
|
for (uint8_t i = 0; i < 128; i++) {
|
||||||
|
if (pml4_virtual[i] & PRESENT_BIT) {
|
||||||
|
CleanupPageStructure(pml4_virtual[i] & ~0xFFF, 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
phys_mem::FreePage(pml4_physical_addr);
|
||||||
|
}
|
||||||
|
|
||||||
void MapPage(uint64_t cr3, uint64_t vaddr, uint64_t paddr) {
|
void MapPage(uint64_t cr3, uint64_t vaddr, uint64_t paddr) {
|
||||||
vaddr = PageAlign(vaddr);
|
vaddr = PageAlign(vaddr);
|
||||||
paddr = PageAlign(paddr);
|
paddr = PageAlign(paddr);
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "object/process.h"
|
#include "object/process.h"
|
||||||
|
|
||||||
void InitializePml4(uint64_t pml4_physical_addr);
|
void InitializePml4(uint64_t pml4_physical_addr);
|
||||||
|
void CleanupPml4(uint64_t pml4_physical_addr);
|
||||||
|
|
||||||
void MapPage(uint64_t cr3, uint64_t vaddr, uint64_t paddr);
|
void MapPage(uint64_t cr3, uint64_t vaddr, uint64_t paddr);
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,8 @@ AddressSpace::AddressSpace() {
|
||||||
InitializePml4(cr3_);
|
InitializePml4(cr3_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AddressSpace::~AddressSpace() { CleanupPml4(cr3_); }
|
||||||
|
|
||||||
glcr::ErrorOr<uint64_t> AddressSpace::AllocateUserStack() {
|
glcr::ErrorOr<uint64_t> AddressSpace::AllocateUserStack() {
|
||||||
uint64_t base = user_stacks_.NewUserStack();
|
uint64_t base = user_stacks_.NewUserStack();
|
||||||
auto mem_object = glcr::StaticCastRefPtr<MemoryObject>(
|
auto mem_object = glcr::StaticCastRefPtr<MemoryObject>(
|
||||||
|
|
|
@ -62,6 +62,10 @@ class AddressSpace : public KernelObject {
|
||||||
AddressSpace(const AddressSpace&) = delete;
|
AddressSpace(const AddressSpace&) = delete;
|
||||||
AddressSpace(AddressSpace&&) = delete;
|
AddressSpace(AddressSpace&&) = delete;
|
||||||
|
|
||||||
|
// Deconstructing an address space will free all paging structures associated
|
||||||
|
// with this address space.
|
||||||
|
~AddressSpace();
|
||||||
|
|
||||||
uint64_t cr3() { return cr3_; }
|
uint64_t cr3() { return cr3_; }
|
||||||
|
|
||||||
// User Mappings.
|
// User Mappings.
|
||||||
|
|
|
@ -105,6 +105,8 @@ void Process::Cleanup() {
|
||||||
PANIC_ON_ERR(vmas_->FreeAddressRange(0, kUserSpaceMax),
|
PANIC_ON_ERR(vmas_->FreeAddressRange(0, kUserSpaceMax),
|
||||||
"Failed to cleanup userspace mappings in process exit.");
|
"Failed to cleanup userspace mappings in process exit.");
|
||||||
|
|
||||||
// 4. Release paging structures. TODO
|
// 4. Release paging structures.
|
||||||
|
vmas_ = nullptr;
|
||||||
|
|
||||||
state_ = FINISHED;
|
state_ = FINISHED;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue