Fixed x64 memory leaks upon process termination.
This commit is contained in:
parent
0364ce6f55
commit
4f3e22140c
|
@ -78,8 +78,8 @@ multiboot_entry:
|
||||||
addl $0x1000, %edi
|
addl $0x1000, %edi
|
||||||
|
|
||||||
# Page-Directory (no user-space access here)
|
# Page-Directory (no user-space access here)
|
||||||
movl $0x24203, (%edi) # (First 2 MiB)
|
movl $0x24003, (%edi) # (First 2 MiB)
|
||||||
movl $0x25203, 8(%edi) # (Second 2 MiB)
|
movl $0x25003, 8(%edi) # (Second 2 MiB)
|
||||||
addl $0x1000, %edi
|
addl $0x1000, %edi
|
||||||
|
|
||||||
# Page-Table
|
# Page-Table
|
||||||
|
|
|
@ -35,6 +35,7 @@ namespace Sortix
|
||||||
{
|
{
|
||||||
extern size_t stackused;
|
extern size_t stackused;
|
||||||
extern size_t stacklength;
|
extern size_t stacklength;
|
||||||
|
void ExtendStack();
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Memory
|
namespace Memory
|
||||||
|
@ -131,17 +132,34 @@ namespace Sortix
|
||||||
|
|
||||||
void DestroyAddressSpace()
|
void DestroyAddressSpace()
|
||||||
{
|
{
|
||||||
|
// Look up the last few entries used for the fractal mapping. These
|
||||||
|
// cannot be unmapped as that would destroy the world. Instead, we
|
||||||
|
// will remember them, switch to another adress space, and safely
|
||||||
|
// mark them as unused. Also handling the forking related pages.
|
||||||
|
addr_t fractal3 = (PMLS[4] + 0)->entry[510UL];
|
||||||
|
addr_t fork2 = (PMLS[3] + 510UL)->entry[0];
|
||||||
|
addr_t fractal2 = (PMLS[3] + 510UL)->entry[510];
|
||||||
|
addr_t fork1 = (PMLS[2] + 510UL * 512UL + 510UL)->entry[0];
|
||||||
|
addr_t fractal1 = (PMLS[2] + 510UL * 512UL + 510UL)->entry[510];
|
||||||
|
addr_t dir = currentdir;
|
||||||
|
|
||||||
// First let's do the safe part. Garbage collect any PML1/0's left
|
// First let's do the safe part. Garbage collect any PML1/0's left
|
||||||
// behind by user-space. These are completely safe to delete.
|
// behind by user-space. These are completely safe to delete.
|
||||||
RecursiveFreeUserspacePages(TOPPMLLEVEL, 0);
|
RecursiveFreeUserspacePages(TOPPMLLEVEL, 0);
|
||||||
|
|
||||||
// TODO: Right now this just leaks memory.
|
|
||||||
|
|
||||||
// Switch to the address space from when the world was originally
|
// Switch to the address space from when the world was originally
|
||||||
// created. It should contain the kernel, the whole kernel, and
|
// created. It should contain the kernel, the whole kernel, and
|
||||||
// nothing but the kernel.
|
// nothing but the kernel.
|
||||||
PML* const BOOTPML4 = (PML* const) 0x21000UL;
|
PML* const BOOTPML4 = (PML* const) 0x21000UL;
|
||||||
SwitchAddressSpace((addr_t) BOOTPML4);
|
SwitchAddressSpace((addr_t) BOOTPML4);
|
||||||
|
|
||||||
|
// Now safely mark the pages as unused.
|
||||||
|
Page::Put(fractal3 & PML_ADDRESS);
|
||||||
|
Page::Put(fractal2 & PML_ADDRESS);
|
||||||
|
Page::Put(fractal1 & PML_ADDRESS);
|
||||||
|
Page::Put(fork2 & PML_ADDRESS);
|
||||||
|
Page::Put(fork1 & PML_ADDRESS);
|
||||||
|
Page::Put(dir & PML_ADDRESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
const size_t KERNEL_STACK_SIZE = 256UL * 1024UL;
|
const size_t KERNEL_STACK_SIZE = 256UL * 1024UL;
|
||||||
|
|
|
@ -140,7 +140,8 @@ namespace Sortix
|
||||||
|
|
||||||
// Make sure Page::Put does NOT cause any Page::Get's internally!
|
// Make sure Page::Put does NOT cause any Page::Get's internally!
|
||||||
const size_t NUM_PAGES = 2;
|
const size_t NUM_PAGES = 2;
|
||||||
if ( Page::stacklength - Page::stackused < NUM_PAGES ) { Page::ExtendStack(); }
|
size_t pagestackfree = Page::stacklength - Page::stackused;
|
||||||
|
if ( pagestackfree < NUM_PAGES ) { Page::ExtendStack(); }
|
||||||
|
|
||||||
addr_t fractal1 = PMLS[2]->entry[1022];
|
addr_t fractal1 = PMLS[2]->entry[1022];
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue