ロード時にELFファイルのすべてのコードとデータにRAMを割り当てることはできますか?

ロード時にELFファイルのすべてのコードとデータにRAMを割り当てることはできますか?

Linuxでは、ページの仮想アドレスが参照されるまで、仮想アドレス空間ページにRAMページが割り当てられていないことがわかります。しかし、ロードされる前に、すべてのELFファイルがすでにRAM(RAMディスク)にあるデバイスで組み込みLinuxを使用しています(プロセスは各ELFファイルから始まります)。それで、各ELFファイルがロードされたときにすべてのコードとデータにRAMを割り当てることができるかどうか疑問に思いました。可能であれば、後で使用できるようにメモリ領域を増やすために、すべてのELFファイルのコードとデータがRAMにページングされた後、RAMから各ELFファイルを削除できることを願っています。

ベストアンサー1

mlockall())などのトリックを使用してすべてのプロセスのアドレス空間を

あなたが探しているもの所定の位置で実行(XIP)そして、まず(別々の)RAMにファイルをコピーする代わりに、メモリマップされたストレージから直接ファイルを実行する機能です。

XIPは、実行可能ファイルがリポジトリ(該当する場合はファイルシステム)に配置される方法に厳しい要件を課しているため、サポートするのは困難です。たとえば、メモリにマップされるファイルの部分はストレージ内のページ整列する必要があり、ファイルシステムのメタデータと混在させることはできません。また、理想的には、バイナリは次のようにコンパイルされます。位置独立コードこれにより、ランタイムリンカーがマッピング後にその一部を変更する必要がなくなります。 XIPをサポートするファイルシステムはほとんどありません。

幸いにも私の理解は一時ファイルシステム するXIPをサポートします。これが正しい場合、解決策はtmpfsファイルシステムをマウントして実行する前に実行可能ファイルをそこに移動することです。


修正する後ろにLittle Cowieがコメントしました。:

実行ファイルをtmpfsに移動すると自動的に実行されますか?なぜ? RAMでファイルページをソートする方法は?ローダーは、実行可能ファイルのロードを開始するたびに、実行可能ファイルがXIPモードで実行するために必要な条件を満たしていることを確認しますか?

tmpfsはRAMにファイルを保存する方法のため、XiPをサポートできます。 tmpfs のファイルはメモリページに保存され、各ファイルには tmpfs の他のファイルと共有されていない一連のメモリページセットが割り当てられます。 (これがtmpfsのファイルが常に4KiB(ページサイズ)の倍数を占める理由です。)データは、ファイルの最初のバイト、メモリページの最初のバイトなどに格納されます。したがって、mmap()呼び出し(またはカーネルELFローダー)がファイル内のページをマップするときにデータを新しいページにコピーする必要はなく、マッピングがソートされている限り、すでにtmpfsに属しているページを共有するだけです。 (ELFの場合も同様です)。

おすすめ記事