32ビットアーキテクチャに分割

32ビットアーキテクチャに分割

私はチップセットベンダーのカスタマイズされた組み込みLinuxディストリビューションにアプリケーションソフトウェアを統合しています。私が開発しているARMベースの製品です。カーネルは64ビットで構築されましたが、残りのユーザースペースは32ビットであることを確認しました。

ユーザースペースが32ビットであっても、カーネルを64ビットで構築するとパフォーマンス上の利点はありますか?このSOCはARM Cortex-a53に基づいています。

ユーザースペースを32ビットに設定すると、ユーザースペースのRAMスペースが小さくなることが示唆されました。カーネルにも同様に適用されますが、カーネルは64ビットです。パフォーマンスが良くなると思いますか?

ハードウェアに関する特定の情報:

  • ARM皮質a53
  • 1GB RAM

PS:機密保持の制限により、ベンダー名を開示できません。

ベストアンサー1

Linuxプロセスの仮想アドレス空間は2つの領域に分けられます。

  • カーネル空間
  • ユーザースペース。

32ビットアーキテクチャに分割

armやi386などの32ビットアーキテクチャでは、従来の分割は次のように3:1です。

    +--------+ 0xffffffff
    | Kernel |
    +--------+ 0xc0000000
    |        |
    | User   |
    |        |
    +--------+ 0x00000000
  • カーネルスペース - 1GiB
  • ユーザースペース - 3GiB

したがって、カーネルはいつでも最大1GiBの物理メモリをマッピングできますが、残りの物理メモリにアクセスするには一時的にマッピングされた仮想アドレス空間が必要なため、追加の分割が必要です。分析は次のとおりです。

  • 低い896MiB(0xc0000000〜0xf7ffffff)はカーネル物理アドレス空間に直接マッピングされます。
  • 残りの128MiB(0xf8000000〜0xffffffff)は、要求時にカーネルから上位メモリにマッピングするために使用されます。

配列は次のとおりです。

                                                 physical memory 2 GiB 
                                          +------> +------------+
                                          |        |  1152 MiB  |  
                                          |        |            |  
    +------------------+ 0xffffffff  -----+        |  HIGH MEM  |  
    | On Demand 128MiB |                           |            |  
    +------------------+ 0xf8000000  ------------> +------------+  
    |                  |             ------+  
    |  Direct mapped   |                   +-----> +------------+   
    |    896 MiB       |             --+           |   896 MiB  |        
    +------------------+ 0xc0000000    +---------> +------------+  

したがって、Linuxカーネルはhighmemインタフェースを介して2/4/6/8 GiBの範囲の物理メモリへの間接的なアクセスを提供します。しかし、一時マッピングの作成に関連するコストはかなり高くなる可能性があります。アーキテクチャは、コアのページテーブル、データTLB、および/またはMMUレジスタを操作する必要があります。

64ビットアーキテクチャ情報

3G/1G パーティショニングは適用されません。巨大なアドレス空間のため、ユーザー空間とカーネル空間の間の分割方法を選択して、物理メモリ全体をカーネルアドレス空間にマッピングできます。これにより、32ビットアーキテクチャで発生する一時マッピングのすべてのオーバーヘッドが節約されます。

64ビットアーキテクチャのLinuxカーネルでは高メモリサポートがオプションであり、64ビットアーキテクチャのLinuxでは高メモリサポートも無効になります。

引用:Linux高容量メモリ処理

おすすめ記事