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

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

[[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%下落、今年中国で開始されたばかり

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

推薦する

実店舗の売上を伸ばす10の方法

月給5,000~50,000のこれらのプロジェクトはあなたの将来ですマーケティングは企業の収益性の鍵...

電子商取引調査: 地元の肉製品に重点を置くモバイル電子商取引会社 AgLocal

アグローカルホーム「電子商取引研究」は、新浪科技が立ち上げた海外の電子商取引サイトを紹介する新しいコ...

Hostyun の香港 EQ データセンター モバイル CMI ライン 10Gbps 帯域幅 VPS の簡単なレビュー

Hostyunは香港のEQデータセンターにVPSを追加しました。デフォルトのアクセスはモバイルCMI...

3人の男が営利目的で「伝説のプライベートサーバー」を立ち上げ、著作権侵害の疑い

楽山市の20代前半の若者3人が個人的にネットワークサーバーを設置し、人気のオンラインゲーム「Lege...

DevOps がクラウド コンピューティングに影響を与える 5 つの領域

調査会社 Allied Market Research によると、DevOps 市場は 2023 年...

簡単な議論: 粉乳業界でオンラインマーケティングを実施する方法

乳児用調合乳市場は特殊な業界です。調合乳のユーザーは製品に対する自分の気持ちを表現することができず、...

ハードウェアの観点から見たエッジコンピューティングとは何ですか?

IoT および IIoT デバイスによって生成される膨大な量のデータにより、エッジ コンピューティン...

アリババクラウド史上最大の値下げ:コア製品の価格が全面的に引き下げられ、最大値下げは50%に達する

4月26日、アリババクラウドは史上最大の値下げを発表し、コア製品の価格が全面的に15%から50%引き...

素晴らしい!ゲーム情報フロー広告の実践事例60件以上を分析!

まず、ゲーム素材のデザイン目標は、プレイアビリティと高品質を強調することであることを強調したいと思い...

仮想プライベートクラウドの長所と短所

仮想プライベート クラウド (VPC) は少なくとも 10 年ほど前から存在していますが、使用する前...

ウェブマスターはYixinのマーケティングに惑わされてはいけない

今日、私は A5 Webmaster Network の編集者である Cancan とチャットをしま...

Kubernetes における負荷分散の完全ガイド

多くの企業は、コンテナを展開する際に、コンテナ オーケストレーション システムとして Kuberne...

friendhosting: 2018年春に45%割引、8つのデータセンター、無制限のトラフィックVPS、カスタムISO

ブルガリアのホスティング プロバイダー friendhosting (2009 年 4 月~) は、...

このK8Sアーキテクチャ分析を書くのに10時間を費やしました

[51CTO.com からのオリジナル記事] インターネット技術の急速な発展に伴い、リクエストの高同...

RamNode: SVDS 専用の 20% 割引クーポン、独立型高構成 VPS

Ramnode、それは本当に簡単ではありません、私たちはVDSビジネスの購入にのみ限定して20%割引...