ret先を見てみると
ebxがゼロだー。これの意味するところは今での経験上から言うと、スタックがずれてしまっているか、ページングミスである。
今回はスタックがずれる要素がないので、ページングミスの可能性が高い。
ページディレクトリAからページディレクトリBに切り替える際にespのリニアアドレスがマッピングされる物理アドレスと比較してみる。
001 directory = (PageEntry*)g_currentThread->archinfo->cr3; 002 003 laddress = g_currentThread->archinfo->esp; 004 directoryIndex = g_page_manager->getDirectoryIndex(laddress); 005 tableIndex = g_page_manager->getTableIndex(laddress); 006 007 table = (PageEntry*)(directory[directoryIndex] & 0xfffff000); 008 paddress = ((dword)(table[tableIndex]) & 0xfffff800) + (laddress % 4096); 009 g_console->printf("laddress=%x paddress=%x\n", laddress, paddress); 010 011 directory = g_page_manager->getKernelDirectory(); 012 013 laddress = g_currentThread->archinfo->esp; 014 directoryIndex = g_page_manager->getDirectoryIndex(laddress); 015 tableIndex = g_page_manager->getTableIndex(laddress); 016 017 table = (PageEntry*)(directory[directoryIndex] & 0xfffff000); 018 paddress = ((dword)(table[tableIndex]) & 0xfffff800) + (laddress % 4096); 019 g_console->printf("laddress=%x paddress=%x\n", laddress, paddress); 020 021 これを実行すると 022 laddress=0x00101FD4 paddress=0x00801FD4 023 laddress=0x00101FD4 paddress=0x00101FD4 024 となる。 025
つまり前者のページディレクトリがリニアアドレス=物理アドレスのマッピングに失敗しているのだ!!
というわけでデバッグは続いていくのだ (続く)
こんな内容の日記でいいのか?おもしろいのか?ヽ(´ー`)ノ