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

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

私は現在、チップセット ベンダーのカスタム Embedded Linux ディストリビューションにアプリケーション ソフトウェアを統合中です。これは私が取り組んでいる ARM ベースの製品です。カーネルは 64 ビットで構築されていますが、ユーザー スペースの残りは 32 ビットであることに気付きました。

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

誰かが、ユーザー スペースを 32 ビットにすると、ユーザー スペースの RAM フットプリントが小さくなると示唆しました。同じことがカーネルにも当てはまりますが、カーネルは 64 ビットです。パフォーマンスが向上するのでしょうか?

ハードウェアに関する具体的な内容:

  • ARM 皮質 a53
  • 1 GB の RAM

追記:非公開規定によりベンダー名を開示することはできません。

答え1

Linux プロセスの仮想アドレス空間は、次の 2 つの領域に分かれています。

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

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

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

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

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

  • 下位896 MiB(0xc0000000から0xf7ffffff)はカーネルの物理アドレス空間に直接マッピングされます。
  • 残りの 128 MiB (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 の高メモリ処理

関連情報