カーネルmmap操作のメモリサイズ


9

Linuxがメインメモリにファイルをmmapsする方法(私のコンテキストでは実行するためですが、mmapプロセスは書き込みと読み取りでも同じだと思います)とそれが使用するサイズに興味があります。

したがって、Linuxが通常4kBのページサイズでページングを使用していることを知っています(カーネル内でこのサイズを見つけることができますか?)。しかし、これは割り当てられたメモリに対して正確に何を意味するのでしょう。数千バイトのサイズのバイナリがあると仮定し、5812Bとだけ言って実行します。カーネルで何が起こるか:2 * 4kBを割り当ててから、5812Bをこのスペースにコピーし、2ページ目で3KBを超えるメインメモリを浪費していますか?

ページサイズが定義されているカーネルソース内のファイルをだれかが知っているとすばらしいでしょう。

私の2番目の質問も非常に単純だと思います。ファイルサイズとして5812Bを想定しました。このサイズは単にiノードから取得されるのは正しいのでしょうか。

回答:


6

実行可能ファイルのサイズとメモリ内のサイズの間に直接的な関係はありません。バイナリが実行されたときに何が起こるかを非常にすばやく概説します。

  1. カーネルはファイルを解析し、セクションに分割します。一部のセクションは、個別のページでメモリに直接読み込まれます。一部のセクションがまったくロードされません(デバッグシンボルなど)。
  2. 実行可能ファイルが動的にリンクされている場合、カーネルは動的ローダーを呼び出し、必要な共有ライブラリをロードして、必要に応じてリンク編集を実行します。
  3. プログラムはコードの実行を開始し、通常、データを格納するためにより多くのメモリを要求します。

実行形式、リンク、実行可能ロードの詳細については、John R. Levineによるリンカーとローダーを参照してください

5kBの実行可能ファイルでは、ヘッダー以外のすべてがメモリにロードする必要があるコードまたはデータである可能性があります。実行可能コードは少なくとも1ページ、場合によっては2ページであり、スタックには少なくとも1ページ、おそらく1ページまたはヒープ(その他のデータ)に加えて、共有ライブラリが使用するメモリがあります。

Linuxでは、を使用して実行可能ファイルのメモリマッピングを検査できますcat /proc/$pid/maps。形式はマニュアルproc(5)ページに記載されています。Linux / proc / id / mapsについても参照してください。


0

はい:最終的に2つの4kページを取得します。データはオンデマンドで読み込まれるため、2番目のページを参照するものがなければ、メモリに読み込まれることはありません。

include/asm-i386/param.h:#define EXEC_PAGESIZE  4096
include/asm-i386/elf.h:#define ELF_EXEC_PAGESIZE        4096

これらの値を変更しないでください。また、正常に機能することを期待してください。

はい、ファイルサイズはext2 / 3のiノードに保存されます。


0

定義部分については、Intelアーキテクチャー用の2.6.38〜ishカーネル:

arch / x86 / include / asm / page_types.h:

/ * PAGE_SHIFTはページサイズを決定します* /

#define PAGE_SHIFT 12

#define PAGE_SIZE(_AC(1、UL)<< PAGE_SHIFT)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.