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 

つまり前者のページディレクトリがリニアアドレス=物理アドレスマッピングに失敗しているのだ!!


というわけでデバッグは続いていくのだ  (続く)


こんな内容の日記でいいのか?おもしろいのか?ヽ(´ー`)ノ