メモリは大切に
アプリケーションがmallocで確保したメモリに対してfreeが呼び出された場合に、実際にマッピングされている物理ページを返却する仕組みを昨日からデバッグ中。
この仕組みがあればサーバーのような、起動しっぱなしのアプリケーションの物理ページも不要時にすぐに返却されていい感じだ。
でもまだバグっている模様、FILE.BINが盛大に死ぬので・・・
void PageManager::returnPages(PageEntry* directory, LinearAddress address, dword size) { ASSERT(directory); if (address < 0xC0000000 || (0xC0000000 + 8 * 1024 * 1024) < address) return; logprintf("****** [%s]address = %x size = %d\n", g_currentThread->process->getName(), address, size); dword orgAddress = address; address = ( (address + ARCH_PAGE_SIZE - 1) & 0xFFFFF000); for (int i = 0; (address + i * ARCH_PAGE_SIZE + ARCH_PAGE_SIZE) < (orgAddress + size); i++) { dword targetAddress = address + i * ARCH_PAGE_SIZE; dword directoryIndex = getDirectoryIndex(targetAddress); dword tableIndex = getTableIndex(targetAddress); PageEntry* table = (PageEntry*)(directory[directoryIndex] & 0xfffff000); logprintf("targetAddress = %x \n", targetAddress); if (isPresent(&table[tableIndex]) ) { PhysicalAddress paddress = ( (dword)(table[tableIndex]) ) & 0xfffff000; returnPhysicalPage(paddress); table[tableIndex] = 0; if ( (targetAddress + ARCH_PAGE_SIZE) % (4 * 1024 * 1024) ) continue; int counter = 0; for (int j = 0; j < ARCH_PAGE_TABLE_NUM; j++) { if (!isPresent(&table[j]) ) continue; counter++; } if (counter == 0) { returnPageTable(table); directory[directoryIndex] = 0; } } } }