tasking: implement task_kill function, thanks deepseek

This commit is contained in:
2025-06-23 00:25:23 +03:00
parent 70d6aacb91
commit c047dd687b
6 changed files with 86 additions and 77 deletions
+17 -16
View File
@@ -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));
}