確かに、QEMU でエミュレートされたハードウェア プラットフォームの RAM を屋外での作業、たとえば監視、試行、または
QEMU music は、メモリを調査することを許可しますが、基本的には基本的に最も正しい手順ではありません。もう 1 つのジョブ (C プログラムや外部シミュレーター、おそらく SystemVerilog で記述されたツールをシミュレートする Questasim) から入力することはもはや基本的ではありません
他のプロセスから見える x86_64 エミュレートされた PC システムのメモリを製造する方法についての戦略。 いくつかの 例 がオンラインにありますが、最初の記憶、最も便利な部分、愛 NVDIMMs (不揮発性 DIMM)。 QEMU のドキュメント は非常に充実していますが、それにもかかわらず、おそらく調達したいものを繰り返し簡単に入手することはもはや容易ではありません.
QEMU でエミュレートされ、他のプロセスからアクセス可能なシステムの最初のメモリを製造する方法についての戦略のデモンストレーションを作成するために、この投稿を書きました。
TL DR : フラグメント TL DR
を参照 )はじめに
次のエクスポーズでQEMUを起動していることを伝えましょう:
qemu -M pc -nographic -m 512m -smp cpus=2 -kernel ./bzImage_5.9 -drive file=./rootfs-target.img,if=ide -append “console=ttyS0 root=/dev/sda rw terror=1 Earlyprintk=serial,ttyS0,115200”
メモリバックエンドラム
– デフォルトのバックエンド
これはフォームのマシンを起動します「pc」、グラフィックなし、512M の RAM、2 つの CPU、提供された Linux 5.9 カーネルは、単一の IDE ドライブと同じくらい成功しました。 -append 文字列は Linux カーネルに渡され、シリアル コンソールとrootfs の配置
-m 512m で指定されたメインメモリの 512M デフォルトの QEMU メモリ バックエンドを使用します。 あるいは、QEMU には代替の
- メモリ バックエンド
.
があります。
memory-backend-file
- – ファイルによってバックアップされるメモリ。不揮発性メモリ (マシンの電源を切ったときに内容を接続するため)
memory-backend-memfd
- – 匿名メモリ ファイル バックエンド
は QEMU のドキュメント
では、memory-backend-memfd を使用することを提案しています。 外部プロセスでメモリを分割します。 しかし、memory-backend-file
- を
/dev/shm デジタル ファイルシステム . どちらも共有メモリを使用しますが、ファイル バックエンドを使用して、ファイルに名前を付けることができます (名前がない代わりに)。 これにより、ファイル記述子の代わりにファイル名で実行されるように見えるため、メモリの共有がより簡単になります。
-object memory-backend-file,id=id,size=size,mem-route=dir,fraction=on|off,discard-recordsdata=on|off,merge=on|off,dump=on|off,prealloc=on|off,host-nodes=host-nodes,protection=default|preferred|bind|interleave,align=align,readonly=on|offQEMU ドキュメンテーション では、次の情報が得られます。 公開と代替
「メモリ ファイルのバックエンド オブジェクトを作成します。これは、山積みのページでゲスト RAM と仲良くするには一見弱そうです。」
だからさて、このバックエンドを利用してメモリを製造するために、QEMU 起動ヒスを自信を持って適応させるにはどうすればよいでしょうか?
.この情報を使用して、次のエクスポーズ
qemu -M pc -nographic -m 512m で QEMU を実行してみました。 -object memory-backend-file,id=mem,size=512M,mem-route=/dev/shm/qemu-ram ,fraction=on -smp cpus=2 -kernel ./bzImage_5.9 -drive file=./rootfs -target.img,if=ide -append "console=ttyS0 root=/dev/sda rw terror=1 Earlyprintk=serial,ttyS0,115200"
これにより QEMU が起動し、ファイル
/dev/shm/qemu-ram が作成されます それにもかかわらず、
/dev/shm/qemu-ram
- ファイルはクリーンですRAM の内容を検討しなくなります (たとえば、ファイルに対して
- shasum
- を実行すると、繰り返し返されます)。
そこで、QEMU でメモリ容量が不足していないかどうかを確かめるために友達になりました。 QEMU コンソール (ctrl-a c) を開き、
(qemu) info mtree
I評価
私は、最初の RAM (512M) がしばしば pc.ram と呼ばれ、システムで可視であることを確認する立場にいます。メモリ空間 (
0x0000'0000-0x1fff'ffff
- )。 あるいは、私が追加した
mem
- という記事はどこにもありません。同じ (ctrl-a c) エクスポーズを使用して、QEMU コンソールから befriend に切り替えます。
レコメンデーションで最初にアクセスできるのは、オブジェクトの名前を変更することです pc.ram
qemu -M pc -nographic -m 512m -object memory-backend-file,id=pc.ram ,size=512M,mem-route=/dev/shm/qemu-ram,fraction=on -smp cpus=2 -kernel ./bzImage_5.9 -drive file=./rootfs-target.img,if=ide -append "console=ttyS0 root=/dev/sda rw terror=1 Earlyprintk=serial,ttyS0,115200"
QEMU を実行すると、次のようなエラーが表示されます
ID
pc.ram
- なので、これを使ったブランドコンテンポラリーオブジェクト
安心できる不安は残ります… 解決策はQEMUのドキュメントのどこにも見つからず、ネットでしばらく買い物をした後、私はここにたどり着きました –
machine memory-backend
- QEMU トレンド メーリング リストのいくつかの投稿で可能性があります。 後で、可能性が現在文書化されておらず、それを示唆していることを示唆する
投稿に出くわしました。
この追加情報により、次の QEMU エクスポーズを提供する準備が整いました
qemu -M pc -nographic -m 512m -object memory-backend-file,id=pc.ram,size=512M,mem-route=/dev/shm/qemu-ram, fraction=on -マシンメモリ-backend=pc.ram
これはエラーなしで起動し、ファイル /dev/shm/qemu-ram
- を作成し、実行中 shasum
- は、ファイルが更新されるシステムごとにまったく異なる結果を提供し、適切なシグナル ! 記憶の共有 – デモンストレーション
解決策は、上記で強調表示されたマシン メモリ バックエンドの可能性を、作成されたファイルにバックアップされたメモリ オブジェクトを利用する音声で公開する QEMU に追加するようになりました。 id が
- pc.ram
- 以外の何かである可能性があることを示します。記事と機械の両方の選択肢で同一であること。 これは、QEMU メモリ ツリーで選択された ID とともに表示されることがあります。
qemu -M pc -nographic -m 512m -object memory-backend-file,id=pc.ram,size=512M,mem-route=/dev/shm/qemu-ram,fraction=on -machine memory-backend=pc.ram
もう 1 つのジョブからエミュレートされた PC の RAM にアクセスして調整するデモとして、エビ ユーティリティを作成しました shmem2
- (あたり
devmem2) を使用して、共有メモリ レコードデータを調査および書き込みます。
gcc -m32 -o shmem2 shmem2.c -lrt でアセンブル
このユーティリティの使い方を以下に示します
それが実際に機能することを想像するために、0x0000'0000
- エミュレートされたシステムに含まれる RAM の
- devmem2
(私のエミュレートされた PC は、devmem2 ユーティリティが組み込まれた Ubuntu rootfs を備えた Linux 5.9 カーネルを実行していますが、必要に応じて提供からアセンブルするか、たまたま「裸の金属」プラットフォームをエミュレートしている可能性がある場合はいつでも、すでに購入した物理メモリへのエントリをぶら下げることさえできます.
RAM は価格を保持します 0xF000FF53
。 次に、 との同一の物理取引で
- shmem2
- で共有メモリ ファイルを起動しましょう。 0x0000'0000
正価を調べていることが確認できます! それでは、友達になる何かを書きましょう。 ランダムな値を RAM のランダムなアドレスに書き込むことは、ほとんどの場合推奨されなくなりました。 以上でデモンストレーションを締めくくります
0x0000'0000 との物理取引時のメモリを調べてみよう から再びエミュレートされたマシンに含まれています.
RAM の内容が変更されました。 ここで、QEMU でエミュレートされたマシンのメモリを外部ジョブと共有する方法を効率的に示しました shmem2
- .
C プログラムでの共有メモリのマッピング
きっと、あなたはきっと夢中になるでしょう。エミュレートされたシステムの RAM を C でマッピングすることについて。例として、ライブラリをコーディングするには、おそらく python から名前を付けて、エミュレートされたシステムの RAM を調べて書きます。
結論を下すのは基本的に launch 共有メモリ ファイルと
draw it
int schmid=0;
if ((shmid=shm_open("/qemu-ram", O_RDWR, 0)) <0) {
perror("shm_open(qemu-ram) に失敗しました"); exit(1);}
*qemu_ram pointer.
これは、他の QEMU エミュレートされたシステムでも成功する場合があります。これは組み込みシステムに適用され、特に一部のガジェットが外部でシミュレートされ、最初の RAM に入る必要がある場合は、実際に手元に届く可能性があります。 RAM の音楽を鳴らしたり、機能を試すために屋外の QEMU から編集したり、
SysteVerilog DPI.結論
QEMU でエミュレートされたマシンのメモリを公平に共有することは、使用する代替手段を賞賛すれば簡単です。 このオプションがあなたにとって一見貴重であり、私が試行錯誤して答えを得る必要があったため、この設定によって時間を節約できることを願っています.
Step 1) Add
-object メモリバックエンドファイル,id=mem,size=512M ,mem-route=/dev/shm/qemu-ram,fraction=on -machine memory-backend=mem
QEMU に公開する
Present :
- -m
で指定されたものと同じ、直立サイズを縮小します。 、ここ -m 512m
- 、続いて
size=512M.Step 2) お届け/dev/shm/qemu-ram
外部ジョブから
ステップ 3) 収入 !