tasking: implement task_kill function, thanks deepseek
This commit is contained in:
+17
-16
@@ -147,26 +147,27 @@ uint32_t* create_page_dir()
|
||||
return new_pd;
|
||||
}
|
||||
|
||||
//TODO: this function is somehow messes up addresses so free_page passes page_nums like 0xF000F into clear_bit
|
||||
void destroy_page_dir(uint32_t* page_dir) {
|
||||
// Iterate through all page directory entries
|
||||
for (int i = 0; i < 1024; i++) {
|
||||
if (page_dir[i] & 1) { // If page table exists
|
||||
uint32_t* page_table = (uint32_t*)(page_dir[i] & 0xFFFFF000);
|
||||
|
||||
// Free all user pages (0-767)
|
||||
if (i < 768) {
|
||||
for (int j = 0; j < 1024; j++) {
|
||||
if (page_table[j] & 1) {
|
||||
free_page((void*)(page_table[j] & 0xFFFFF000));
|
||||
}
|
||||
// Temporarily switch to target PD for freeing
|
||||
uint32_t orig_cr3;
|
||||
asm volatile("mov %%cr3, %0" : "=r"(orig_cr3));
|
||||
asm volatile("mov %0, %%cr3" : : "r"(virt_to_phys(page_dir)));
|
||||
|
||||
// Free only user-space pages (entries 0-767)
|
||||
for (int i = 0; i < 768; i++) {
|
||||
if (page_dir[i] & PAGE_PRESENT) {
|
||||
uint32_t* pt = (uint32_t*)phys_to_virt(page_dir[i] & ~0xFFF);
|
||||
for (int j = 0; j < 1024; j++) {
|
||||
if (pt[j] & PAGE_PRESENT) {
|
||||
free_page((void*)(pt[j] & ~0xFFF));
|
||||
}
|
||||
}
|
||||
|
||||
// Free the page table itself
|
||||
free_page(page_table);
|
||||
free_page((void*)(page_dir[i] & ~0xFFF));
|
||||
}
|
||||
}
|
||||
|
||||
// Free the page directory
|
||||
free_page(page_dir);
|
||||
// Restore original page directory
|
||||
asm volatile("mov %0, %%cr3" : : "r"(orig_cr3));
|
||||
free_page((void*)virt_to_phys(page_dir));
|
||||
}
|
||||
Reference in New Issue
Block a user