GNU/Linux >> Linux の 問題 >  >> Linux

Linux カーネルからメモリのブロックを予約するにはどうすればよいですか?

OS を完全に 無視してください。「memmap」を使用してメモリ ホールを作成する必要があります。 ." このリファレンスを参照してください。たとえば、2GB バリアで 512M が必要な場合は、「memmap=512M$2G」と入力できます。 " カーネル コマンド ラインで

dmesg を確認する必要があります 盗む連続した穴を見つけて、デバイスを踏みつけないようにします。これは、マザーボードとカードに固有のものです。

これは違う 推奨される方法 - 適切に行う方法については、Warren Young の回答 (カーネル ドライバー + DMA) を参照してください。私はあなたが尋ねた正確な質問に答えています。これをエンド ユーザー向けに作成する場合、エンド ユーザーは嫌がるでしょう。 あなたが彼らにこれをするなら... 私を信じてください、それが私がこの答えを知っていた唯一の理由です.

編集:grub2 と grubby (CentOS 7 など) を使用している場合は、必ず $ をエスケープする必要があります。単一の \ があるはずです $ の前 .例:

$ sudo -v
$ sudo grubby --update-kernel=ALL --args=memmap='128M\\$0x57EF0000'
$ sudo grubby --info $(sudo grubby --default-kernel) | grep memmap
args="ro crashkernel=auto ... memmap=128M\$0x57EF0000"

あなたが求めているのはDMAと呼ばれます。このメモリを予約するには、ドライバーを作成する必要があります。

はい、OS の介入を望まず、ドライバは OS の一部になりますが、ドライバの予約がない場合、カーネルはすべてのメモリが OS に属していると認識します。 (カーネルにメモリーブロックを無視するように指示しない限り、アーロンの回答によると、そうです。)

Rubini、Corbet、および Kroah-Hartmann による「Linux Device Drivers, 3/e」の第 15 章 (PDF) では、DMA および関連トピックについて説明しています。

この HTML 版が必要な場合は、この章の第 2 版をオンラインで見つけました。第 2 版は、カーネル 2.4 が新しくなったときに出てきたもので、10 年以上前のものであることに注意してください。当時からカーネルのメモリ管理サブシステムには多くの作業が行われてきたため、あまりうまく適用されない可能性があります。


ARM ベースの Linux でカーネルからメモリ ブロックを予約するには、reserved-memory も使用できます。 デバイス ツリー (dts) ファイルのノード。カーネルのドキュメント (ここを参照) には、例があります:

memory {
    reg = <0x40000000 0x40000000>;
};

reserved-memory {
    #address-cells = <1>;
    #size-cells = <1>;
    ranges;

    /* global autoconfigured region for contiguous allocations */
    linux,cma {
        compatible = "shared-dma-pool";
        reusable;
        size = <0x4000000>;
        alignment = <0x2000>;
        linux,cma-default;
    };

    display_reserved: [email protected] {
        reg = <0x78000000 0x800000>;
    };

    multimedia_reserved: [email protected] {
        compatible = "acme,multimedia-memory";
        reg = <0x77000000 0x4000000>;
    };
};

Linux
  1. Linux –どのモジュールがカーネルを汚染しているかを判断する方法は?

  2. Linuxでメモリ消費をログに記録する方法は?

  3. LinuxでCからIPアドレスを設定する方法

  1. コンテナー自体から Docker Linux コンテナー情報を取得するにはどうすればよいですか?

  2. Linux のコマンドラインからビデオのビットレートを取得するにはどうすればよいですか?

  3. Linux カーネルはどうしてこんなに小さいのでしょうか?

  1. Linux カーネルの copy_from_user は内部でどのように機能しますか?

  2. Linux コマンドラインからフォルダーをコピーするにはどうすればよいですか?

  3. ブロックデバイスをネットワーク経由であるコンピュータから別のコンピュータにブロックデバイスとしてマウントするにはどうすればよいですか?