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
つまり前者のページディレクトリがリニアアドレス=物理アドレスのマッピングに失敗しているのだ!!
というわけでデバッグは続いていくのだ (続く)
こんな内容の日記でいいのか?おもしろいのか?ヽ(´ー`)ノ