ユーザー モード プロセスは、仮想アドレスに対応する物理アドレスをどのように取得するのでしょうか?

ユーザー モード プロセスは、仮想アドレスに対応する物理アドレスをどのように取得するのでしょうか?

[[345236]]

一般的に、ユーザー プロセスは物理アドレスをまったく気にしないため、プロセス仮想アドレスに対応する物理アドレスをユーザー状態から取得する必要はありません。

ユーザーは、DMA がユーザー モードで実行されるシナリオ (DPDK など) など、いくつかのアプリケーション シナリオについて懸念する場合があります。各ページのメモリ使用量やスワップアウトの有無などをデバッグして分析するシナリオもあります。

ユーザー モードから仮想アドレスに対応する物理アドレスを取得するには、プロセスのページ テーブルを調べることはできず、権限もありません。幸いなことに、カーネルはページマップと呼ばれるインターフェースを提供しており、このインターフェースはハードウェア アーキテクチャとは何の関係もありません。 /proc/pid/ の下に pagemap というファイルがあります。各ページに対して 64 ビットの記述子を生成し、物理ページ フレーム番号または仮想アドレス ページに対応する SWAP 内のスペースを記述します。詳細については、次のドキュメントを参照してください。

linux/ドキュメント/管理者ガイド/mm/ページマップ.rst

この 64 ビットの説明は次のとおりです。

アーキテクチャが異なれば MMU やページ テーブル形式も異なりますが、ページマップ インターフェイスは特定のページ テーブル形式とは何の関係もなく、抽象化されていると言えます。

次に、スワップの影響を無視し (スワップがオフになっているか、ページが常にピン状態にあると仮定)、仮想アドレスを物理アドレスに変換する DPDK のコード セクションをコピーします。

  1. # phys_addr_t uint64_t を定義します
  2. #PFN_MASK_SIZE 8 を定義します
  3.  
  4. 物理アドレス
  5. rte_mem_virt2phy(定数 void *virtaddr)
  6. {
  7. int fd、戻り値;
  8. uint64_t ページ、物理アドレス;
  9. 符号なしロング virt_pfn;
  10. ページサイズ
  11. off_t オフセット;
  12.  
  13. /* 標準ページサイズ*/
  14. page_size = getpagesize();
  15.  
  16. fd = open ( "/proc/self/pagemap" 、 O_RDONLY);
  17. (fd < 0)の場合{
  18. ...
  19. }
  20.  
  21. virt_pfn = (符号なしlong)virtaddr / ページサイズ;
  22. オフセット = sizeof(uint64_t) * virt_pfn;
  23. (lseek(fd, offset, SEEK_SET) == (off_t) -1) の場合 {
  24. ...
  25. -1 を返します
  26. }
  27.  
  28. retval =読み取り(fd、&page、PFN_MASK_SIZE);
  29. 閉じる(fd);
  30. ...
  31.  
  32. /*
  33. * pfn(ページフレーム番号)はビット0~54です(
  34. * Linux ドキュメントpagemap.txt)
  35. */
  36. ((ページ & 0x7fffffffffffffULL) == 0)の場合
  37. -1 を返します
  38.  
  39. 物理アドレス = ((ページ & 0x7ffffffffffffffULL) * ページサイズ)
  40. + ((unsigned long)virtaddr % ページサイズ);
  41.  
  42. 物理アドレスを返します
  43. }

最後のステップは、キー計算プロセスです。

  1. 物理アドレス = ((ページ & 0x7ffffffffffffffULL) * ページサイズ)
  2. + ((unsigned long)virtaddr % ページサイズ);

page & 0x7ffffffffffffffULL はページ フレーム番号 (PFN) を取得し、それをページ サイズで乗算してこのページの開始の物理アドレスを取得し、次に virtaddr % page_size のページ オフセットを追加して最終的な物理アドレスを取得します。

実際に上記の関数を呼び出してアドレス変換を完了してみましょう。

  1. int main( int argc, char *argv[])
  2. {
  3. uint8_t *p = malloc(1024 * 1024);
  4.  
  5. *(p + 4096) = 10;
  6. printf( "virt:%p phys:%p\n" , p + 4096, rte_mem_virt2phy(p + 4096));
  7.  
  8. *(p + 2 * 4096) = 10;
  9. printf( "virt:%p phys:%p\n" , p + 2 * 4096, rte_mem_virt2phy(p + 2 * 4096));
  10. }

結果は次のとおりです。

  1. ~$ sudo ./a.out   
  2. 仮想:0x7f81e402a010 物理:0x2b601010
  3. 仮想:0x7f81e402b010 物理:0x3ceec010

カーネル モードでページマップ proc インターフェイスを実装するためのコードは、次の場所にあります。

  1. fs/proc/task_mmu.c

コア機能は、PTE を pagemap_entry に変換するプロセスです。興味のある方は、ぜひ読んでみてください:

ページマップ内のフラグがどのように設定されているかを知るには、赤い線の位置に特に注意してください。

この記事はWeChatの公開アカウント「Linux Reading Field」から転載したものです。以下のQRコードからフォローできます。この記事を転載する場合は、Linux Reading Field 公式アカウントまでご連絡ください。

<<:  AWSの機械学習クラウドサービスのインスタンスコストが18%下落、今年中国で開始されたばかり

>>:  プログラマーの精神修養への道 - 分散システムにおける最も重要なハブとなるかもしれない

推薦する

ステーションBは1000億ドル規模のeスポーツライブ放送市場に「賭け」をかける

世界トップクラスのeスポーツイベントの3年間にわたる独占生中継、中国のZ世代の若者に最も人気のある2...

クラウド サービスから抽出されたデータからユーザーの位置をどのように推測できますか?

地理位置情報データは、さまざまな政府機関に必要な情報を提供することができ、法執行機関は位置データを使...

練習すれば完璧になる: SEO における IP アドレスの重要性

IP アドレスの選択が百度検索におけるウェブサイトの重みを決定する可能性があることは以前から知られて...

ウェブサイトの寿命を維持する方法の簡単な分析

ウェブサイトが立ち上げられると、オンライン上にはたくさんのウェブサイトが立ち上げられることになります...

NuomiにとってBaiduとは何を意味しますか?トラフィックファンド、モバイルの相乗効果、そしてLBS連携?

【BATの中で、Baiduはますます沈黙しつつあるようだ。しかし、馬小道氏の意見では、彼らは典型的な...

Juju Cat は海賊版を配布したため禁止された。容疑者 3 名が逮捕され、1 名はまだ逃走中である。

Juju Cat は海賊版を配布したため禁止された。容疑者 3 名が逮捕され、1 名はまだ逃走中であ...

SEO初心者は外部リンクの罠に注意する必要がある

今日の話題も決まり文句で、多くの友人が見たことがあるかもしれませんが、それでも詳細に話し、SEO初心...

シンバはセールスキャスターになりたくないんです!

偽の鳥の巣事件により、かつて人気を博した快手のトップキャスター、シンバが再び出禁となった。今回は半年...

#618# Gouyun、クラウドサーバーの30%割引、残高\50%割引コードを獲得できる抽選など、香港\日本\韓国\米国の10以上のデータセンターが利用可能

GouCloudは、年半ばの618特別割引プロモーションを開始しました。すべてのエラスティッククラウ...

医療プロジェクトにおけるウェブ編集に関する理解と意見

医療プロジェクトにおける Web 編集に関する理解と意見。オンラインマーケティングを行うには、ユーザ...

360度検索と百度検索に関する意見

ちょうど今、自分の Web サイト (http://www.zcoos.com) をいじっていたとき...

ガートナーは、クラウド、データセンター、エッジインフラストラクチャの将来を形作る4つのトレンドを特定しました。

経済の不確実性に満ちたこの一年、インフラストラクチャおよび運用 (I&O) チームは新しいテ...

WeChat マーケティング: WeChat コミュニティでコースを販売するための 8 つのコツ!

この記事では、トラフィック生成 -> グループエントリー -> 儀式のインスピレーション...

Trentahost 仮想ホスティング 年間 12 ドル (米国、英国、ルーマニア)

Trentahost は設立されてまだ 1 年も経っていないホスティング会社です。ドメイン名登録、仮...