5

CPU の内部および外部メモリ キャッシュを無効にしようとしています。構成は上記のとおりです。 -DELL Precision WorkStation -Intel Core 2 Duo E6550 2.33 GHz -Ubuntu 8.10

BIOSで無効にしようとしましたが、DELLコンピューターではユーザーがキャッシュメモリにアクセスできないようです.別の方法を見つけました.プログラムでキャッシュを無効にすることです.IntelアーキテクチャマニュアルA.3は、cr0レジスタができることを示しています.ビット30を設定してキャッシュを無効にするように設定すると、上記のコードを書きました:

無効

mov eax,cr0

mov eax,40000000H ; ビット 30 を設定

mov cr0,eax

プログラムは正常にコンパイルされましたが、exe ファイルを実行しようとすると、Seg Faults (私は NASM を使用しています)

誰でも私を助けることができますか?

4

8 に答える 8

9

カーネル内にいる、またはプロテクト モードで DOS でツールを実行しているなどの理由でリング 0 にいる場合でも、0x40000000cr0に移動すると間違いなく災害が発生することに注意してください。ご覧のとおり、制御レジスタ (cr0) は、ページングの有効化、保護モード (直接ではありません) など、プロセッサの動作に影響を与えるあらゆる種類のものを制御します。これらのビットをすべて設定解除すると、まったく異なる結果になります。以前にページングを有効にしていた場合、セグメンテーション違反が発生してもまったく驚くことではありません。

代わりにこれを行う必要があります。

mov eax,cr0
or eax, 40000000H ;set bit 30 without clearing the others
mov cr0,eax
于 2009-07-10T09:25:43.933 に答える
4

このドキュメントは、ウィキペディアの管理登録簿で見つけました。それはあなたの言うことを確認します:

CR0 レジスタは、386 以上のプロセッサでは 32 ビット長です。ロング モードの x86-64 プロセッサでは、このレジスタ (およびその他の制御レジスタ) は 64 ビット長です。CR0 には、プロセッサの基本動作を変更するさまざまな制御フラグがあります。ビット名 フルネーム 説明 31 PG Paging 1 の場合、ページングを有効にして CR3 レジスタを使用し、それ以外の場合はページングを無効にします 30 CD キャッシュを無効にします

これにより、Intel 64 and IA-32 Architectures Software Developer's Manualにたどり着きました。それは言います、そして私はここで再び引用します:

ほとんどのシステムでは、アプリケーション プログラムによるシステム レジスタ (EFLAGS レジスタ以外) へのアクセスが制限されています。ただし、すべてのプログラムとプロシージャーが最も特権レベル (特権レベル 0) で実行されるようにシステムを設計することはできます。このような場合、アプリケーション プログラムはシステム レジスタを変更できます。

おそらくあなたのプログラムは意味的に正しいでしょうあなたのコードにはおそらくマシンをロックするバグがありますが、修正してもスーパーバイザーモードで実行する必要があります. or他のレジスタに影響を与えないように、値を入力する必要があることに注意してください(他の人が指摘したように)。

于 2009-07-10T09:06:40.680 に答える
3

ビット 30 を設定するには、"or eax,40000000h" にする必要があります。カーネルに変更を加える必要があります。あなたが望むことをするためのシステムコールまたはデバイスインターフェイスがあることは間違いありません。

于 2009-07-10T09:05:20.980 に答える
2

カーネルのみがラング 0 で実行されるため、Windows または Linux のドライバーからこれを行う必要があります。1 つのプロセスに対しては実行できないと思います。

キャッシュせずにメモリ書き込みをしようとしていると思いますか?

恐ろしいスレッド コードを実行しようとしている場合、おそらくキャッシュ フラッシュ命令を調べたいと思いませんか?

于 2009-07-10T09:08:20.973 に答える
0

そのためには、root としてログインする必要があると思います。L1 と L2 を無効にすると、コンピューターがロックされる可能性が高いため、なぜキャッシュを無効にする必要があるのか​​ 疑問に思っていました。

于 2009-07-10T09:12:02.883 に答える
0

コードをRing0として実行することで、最終的にキャッシュを無効にすることができました。DrJokepuに感謝しますあなたがくれたリンクはまさに​​私が必要としていたものでした..しかし、新しい問題があります。キャッシュを無効にする新しいモジュールを挿入すると、うまくいきます、.koファイルを insmod するだけで、コードが記述されているプロシージャinitが呼び出されます。しかし、プログラムでキャッシュを再度有効にしたいと思います。cr0をリセットするクリーンな手順を書くことで動作し、rmmodでモジュールを削除するときにそれを呼び出す必要がありますが、実際には何もしません...で確認できますcat /proc/modulesそしてそれは実際にそれを削除しましたが、どうやら、それを削除する前に私のきれいな手順を呼び出していませんでした....

ヘルプ?

于 2009-07-22T08:23:08.980 に答える
0

ユーザーモードで実行されているコードがそれを実行できるとしたら、私は驚くでしょう - それは DoS 攻撃の地獄です。

于 2009-07-10T08:59:38.073 に答える
0

実際には、2 番目の命令 (mov eax,cr0) で Seg fault のようです。他のすべての命令をコメントしようとしたところ、seg fault が発生しました....しかし、まだ理由がわかりません??

ランレベル 0 (ルートとして telinit 1 コマンド ライン) でコンパイル/実行も試みましたが、それでもエラーが発生します...

コントロール レジスタ 0 (cr0) は書き込み保護されていないのでしょうか?

于 2009-07-10T09:43:55.580 に答える