回答:
システムの物理メモリへのアクセスを提供します。
mem(4)
manページには、どのような詳細を説明し/dev/mem
ているが。
はい-それはあらゆる種類の問題を引き起こす可能性があります。再起動すると修正されますが、悪いことが非常に簡単に発生する可能性があります。注意してください!:-)
sudo cat /dev/urandom > /dev/mem
sudoはcatの特権を昇格しますが、リダイレクトの特権は昇格しないため、何もしません。実行sudo su
してからルートシェルで作業するか、または
sudo dd if=/dev/urandom of=/dev/mem
/dev/mem
物理メモリ、つまりシステム内のすべてのRAMへのアクセスを提供しますが、これはRAMへの完全な読み取り/書き込みアクセスを提供することを意味しません(このドキュメントのCONFIG_STRICT_DEVMEMオプションを参照)。また、物理メモリの一部の領域には、ビデオカードメモリなどの他のデバイスがマップされることに注意してください。
盲目的に書く/dev/mem
と、不確実な振る舞いになります。ここに同じことをするyoutubeビデオがあります。
でテストする busybox devmem
busybox devmem
mmapsという小さなCLIユーティリティです/dev/mem
。
Ubuntuでそれを取得できます: sudo apt-get install busybox
使用法:物理アドレスから4バイトを読み取ります0x12345678
:
sudo busybox devmem 0x12345678
0x9abcdef0
そのアドレスに書き込みます:
sudo busybox devmem 0x12345678 w 0x9abcdef0
ソース:https : //github.com/mirror/busybox/blob/1_27_2/miscutils/devmem.c#L85
MAP_SHARED
mmapping /dev/mem
を使用する場合は、おそらく次のものを使用します。
open("/dev/mem", O_RDWR | O_SYNC);
mmap(..., PROT_READ | PROT_WRITE, MAP_SHARED, ...)
MAP_SHARED
書き込みがすぐに物理メモリに送られるため、監視が容易になり、ハードウェアレジスタの書き込みに適しています。
CONFIG_STRICT_DEVMEM
そして nopat
/dev/mem
カーネルv4.9で通常のRAMを表示および変更するために使用するには、次のことを行う必要があります。
CONFIG_STRICT_DEVMEM
(Ubuntu 17.04でデフォルトで設定)nopat
x86のカーネルコマンドラインオプションを渡すIOポートはそれらなしでも動作します。
参照:https : //stackoverflow.com/questions/39134990/mmap-of-dev-mem-fails-with-invalid-argument-for-virt-to-phys-address-but-addre/45127582#45127582
キャッシュのフラッシュ
レジスタの代わりにRAMに書き込もうとすると、CPUによってメモリがキャッシュされる場合があります:https : //stackoverflow.com/questions/22701352/how-to-flush-the-cpu-cache-for-a-region -of-address-space-in-linuxとフラッシュするか、領域をキャッシュ不可としてマークする非常にポータブルで簡単な方法が表示されません。
それでは、/dev/mem
メモリバッファをデバイスに渡すために確実に使用できないのでしょうか?
QEMUはキャッシュをシミュレートしないため、残念ながらQEMUではこれを確認できません。
テストする方法
楽しい部分になりました。いくつかのクールなセットアップを次に示します。
volatile
ユーザーランドプロセスで変数を割り当てる/proc/<pid>/maps
+で物理アドレスを取得します/proc/<pid>/pagemap
devmem2
、およびユーザーランドプロセスの反応を監視します。kmalloc
virt_to_phys
ユーザーランドに返しますdevmem2
devmem2
レジスタへの書き込みに使用printf
応答として仮想デバイスから出てくるのを見る/ dev / memは従来、物理アドレス空間全体へのアクセスを提供していました。これにはRAMが含まれますが、メモリマップされたIOデバイスも含まれます。
最新の多くのカーネルは、「CONFIG_STRICT_DEVMEM」で構成され、/ dev / memをメモリマップされたIOデバイスのみに制限します。
ランダムなガベージを書き込むことは悪い考えですが、何が悪いことになるかを正確に予測することは困難です。ハードウェアはランダムなガベージに予測できない方法で応答する場合があり、カーネルメモリ構造が破損すると、カーネルの予測できない動作が発生する場合があります。せいぜいシステムクラッシュが予想されますが、最悪の場合はデータの破損やハードウェアブリックも問題になりません。
PSでは、sudoはリダイレクトではなくcatコマンドのみを進化させるため、通常のユーザーとして実行する場合、コマンドは何もすべきではないことに注意してください。
dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM