メモリは大切に

アプリケーションが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;
            }
        }
    }
}