メッセージング方針は正しいか?2
CR3レジスタの切替コストを計測するコードを書いてみた。(自信ないので突っ込み募集)
ぜひいろんなCPUでの結果を知りたいのでもしご協力いただけるならば
結果をまとめたページ(http://mona.sourceforge.jp/dynamic/pukiwiki/pukiwiki/pukiwiki.php?%B5%C4%CF%C0%2F%A5%E1%A5%C3%A5%BB%A1%BC%A5%B8%2FCR3%C0%DA%C2%D8%A5%B3%A5%B9%A5%C8)
で、FDイメージをダウンロードして試していただきたい。
/* ループとCR3切替のコスト比較 */ disableInterrupt(); g_page_manager->setPageDirectory(cr31); g_page_manager->setPageDirectory(cr32); dword l1, l2, h1, h2; dword total = 0; int count = 0; g_console->printf("CR3 TEST ********************************************\n"); for (int i = 0; i < TEST_NUM; i++) { rdtsc(&l1, &h1); g_page_manager->setPageDirectory(cr31); rdtsc(&l2, &h2); g_page_manager->setPageDirectory(cr32); if (h1 != h2) continue; total += (l2 - l1); count++; } g_console->printf("cr3 average=%d\n", total / count); total = 0; count = 0; for (int i = 0; i < TEST_NUM; i++) { rdtsc(&l1, &h1); for (int j = 0; j < 10000; j++) { j++; j--; } rdtsc(&l2, &h2); if (h1 != h2) continue; total += (l2 - l1); count++; } g_console->printf("loop average=%d\n", total / count); g_page_manager->setPageDirectory(cr32); enableInterrupt();