web-dev-qa-db-ja.com

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

OSを介さずに、それ専用に予約されたメモリブロックを必要とするデバイスがあります。メモリのブロックが予約されており、それを使用してはならないことをBIOSまたはOSに通知する方法はありますか?

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

26
Nathan Fellman

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

はい、OSの介入を望まず、ドライバーがOSの一部になると言っていましたが、ドライバーの予約がない場合、カーネルはすべてのメモリがそれに属していると信じています。 (カーネルにメモリブロックを無視するように指示しない限り、アーロンの答えに従ってください。)

第15章 (PDF)の " Linux Device Drivers、3/e "によるRubini、Corbet、およびKroah-HartmannのカバーDMAおよび関連トピック。

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

24
Warren Young

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

dmesgをチェックして、盗む連続した穴を見つけて、どのデバイスにも踏み込まないようにする必要があります。それはあなたのマザーボード+カードに固有です。

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


編集:grub2 w/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"
25

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>;
    };
};
5
Vladimir S.

最初に次のコマンドを入力して、現在の設定を確認します。

sysctl vm.min_free_kbytes

設定値を変更するには、/etc/sysctl.conf。次の行を探します。

vm.min_free_kbytes=12888

存在しない場合は、(必要な値とともに)作成します。次の値を使用できます。

8192
12288
16384
20480

8Mは非常に保守的です。 16Mで快適に座れます。値を変更したら、これを実行します。再起動は必要ありません。

Sudo sysctl -p
0
user31056