Qemu仮想マシンでメモリマップされたハードウェアレジスタを読み書きするためにgdb(リモート接続)を使用しようとしています。しかし、うまくいきません。
(gdb) p *0x2000000
Cannot access memory at address 0x20000000
しかし、コンピュータにログインして実行すると
# devmem 0x2000000
0xE321F0D3
これは素晴らしい作品です。明らかにgdbはそれから情報を取得しません/dev/mem
。私が考えることができるすべてのコンパイル時デバッグフラグを有効にしました。ブレークポイントを設定し、コードを段階的に実行し、シンボルに関連する逆参照ポインタを設定できます。ただし、ほとんどの生のポインタの逆参照は失敗します。
記録のためにこれが私がqemuを始める方法です:
qemu-system-arm -M versatilepb -kernel output/images/zImage \
-dtb output/images/versatile-pb.dtb \
-drive file=output/images/rootfs.ext2,if=scsi \
-append "root=/dev/sda console=ttyAMA0,115200 nokaslr norandmaps printk.devkmsg=on printk.time=y" \
-nographic -s
nokaslr
私はそれが変化をもたらすと思ったので、そこに背中を追加しました。明らかにそうではありません。何が起こっているのか知っている人はいますか?
答え1
gdb
そしてdevmem
2つの異なることをしています。gdb
見る0x20000000
場所マッピングされたあなたのプロセスアドレス空間、プロセスによって異なります(そうでなければ、スワップファイルとページテーブルは本質的に役に立ちません)。devmem
ファイルを見て/dev/mem
物理メモリを直接見ています。
プロセスアドレス空間がすべての物理アドレス位置をプロセスに公開しないのはなぜですか?主な理由は、これが大きなセキュリティホールになる可能性があることです。任意のプロセスが自分が所有していないメモリからデータを読み書きできるようにしたくありません(そうしないと、セキュリティを簡単に迂回できます)。このdevmem
ページに掲載しています、「一部の物理アドレスはハードウェアレジスタです。これを書き込むだけで、コンピュータ/デバイスがクラッシュしたり、溶けたり爆発したりする可能性があります。警告しました!」