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

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

[[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 の方法

私は毎週1つの記事を翻訳していますが、それは簡単な作業ではありません。読むことから、選考、試訳、そし...

質問応答システムに成功の要素を与えるものは何でしょうか?

過去 2 年間、質疑応答システムはますます頻繁に人々の視界に現れています。これは、以前のフォーラム ...

雲の上まで舞い上がって「クラウドライダー」になれるのは誰でしょうか?

調査対象となった全世界の企業のうち 13% が「クラウド ライダー」であり、そのうち 10% が中国...

SEO最適化で注意すべき点とは?初心者必読

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスウェブサイトの構築は簡単...

2018年には、約200社の顧客がクラウドコンピューティングにZStackを選択しました。

私はXinさんと年に1、2回コミュニケーションを取っていますが、そのたびにたくさんの新しい驚きがあり...

リモートネットワークの信頼性を向上させるにはどうすればよいでしょうか?

在宅勤務が当たり前になるにつれ、多くのネットワーク管理者は、オンサイトレベルと同等かそれ以上のレベル...

ウェブマスターネットワークニュース:多くのファンド会社が余宝の例に倣い、WeChatは支払い機能を追加します

1. テンセントは、プラットフォーム上でビジネスを始める方法と、テンセントの助けを借りて5つの障害を...

分散型ソフトバスにより、アリババの商人はマルチデバイスライブ放送を再生できる

[[428752]]詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したH...

テンセントの鍾祥平氏:デジタル経済発展の新たな原動力となるスマート交通ネットワークの構築

2021年11月3日、「デジタルと現実の融合、新たなチャンスの爆発」をテーマにしたテンセントデジタル...

iovz: 韓国のクラウドサーバー/VPS、SKデータセンター、月額60元から、2Gメモリ/2コア/50Gハードディスク(Windows提供)/5M帯域幅(トラフィック無制限)

iovz は、韓国の SK データセンターにクラウド サーバーを提供しています。このサーバーは中国本...

クラウド コンピューティングのコストを削減する 12 のプログラミング ヒント

翻訳者 |李睿校正 |孫淑娟クラウド コンピューティングのコストを削減するには、開発者を含むチーム全...

体重に影響を与える3つの要素について簡単に説明します

SEO 業界がポスト PR 時代に入るにつれ、最適化担当者は PR に代わる参照データを見つけること...

回復力と拡張性に優れたクラウドネイティブアプリケーションを構築する

クラウドネイティブ アプリケーション設計により、ソフトウェア エンジニアは顧客のニーズを満たすことに...