Linuxカーネルでメモリブロックを予約する方法は?

Linuxカーネルでメモリブロックを予約する方法は?

OS介入なしに特別に予約されたメモリブロックを必要とするデバイスがあります。メモリブロックが予約されており、使用できないことをBIOSまたはオペレーティングシステムに通知する方法はありますか?

私はopenSUSEシステムでこのデバイスを使用しています。

答え1

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

dmesgどんな装置も踏まないように、連続的な穴を見つけなければなりません。これはマザーボード+カード専用です。

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


編集: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"

答え2

あなたが求めるものをDMAと呼びます。そのメモリを予約するにはドライバを作成する必要があります。

はい、OSが干渉し、ドライバがOSの一部になることを望まないと言ったことがわかります。しかし、ドライバの保存がなければ、カーネルはすべてのメモリがOSに属すると思います。 (Aaronの答えに従って、カーネルにメモリブロックを無視するように指示しない限り)。

第15章(PDF)のうち「Linuxデバイスドライバ、3/eRubini、Corbet、Kroah-Hartmannによる「DMAと関連トピック」。

これのHTMLバージョンが欲しいなら、私は見つけました。この章の第2版他の場所ではオンラインで。バージョン2は10年を超えており、カーネル2.4が登場したときにリリースされました。それ以来、カーネルのメモリ管理サブシステムで多くの作業が行われているため、これ以上適用されなくなる可能性があります。

答え3

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: framebuffer@78000000 {
        reg = <0x78000000 0x800000>;
    };

    multimedia_reserved: multimedia@77000000 {
        compatible = "acme,multimedia-memory";
        reg = <0x77000000 0x4000000>;
    };
};

答え4

現在の設定を確認するには、次のコマンドを入力して開始します。

sysctl vm.min_free_kbytes

設定を変更するにはを編集します/etc/sysctl.conf。次の行を探してください。

vm.min_free_kbytes=12888

存在しない場合は、必要な値で作成します。次の値が許可されます。

8192
12288
16384
20480

8Mは非常に保守的です。 16Mも快適に座れます。値を変更した後、再起動せずに次のコマンドを実行します。

sudo sysctl -p

関連情報