2

mlockall私のカーネル3.0のmanページには次のように書かれています

mlockall() は、呼び出しプロセスのアドレス空間にマップされたすべてのページをロックします。これには、コード、データ、スタック セグメントのページ、共有ライブラリ、ユーザー空間のカーネル データ、共有メモリ、およびメモリ マップ ファイルが含まれます。呼び出しが正常に返されると、マップされたすべてのページが RAM に存在することが保証されます。ページは後でロックが解除されるまで RAM に保持されることが保証されます。

そして後で言う

ページ フォールトの遅延を防ぐために mlockall() を使用しているリアルタイム プロセスは、関数呼び出しによってページ フォールトが発生しないように、タイム クリティカルなセクションに入る前に十分な数のロックされたスタック ページを予約する必要があります。これは、十分に大きな自動変数 (配列) を割り当てる関数を呼び出して、これらのスタック ページにアクセスするために、この配列が占有するメモリに書き込むことによって実現できます。このようにして、十分な数のページがスタックにマップされ、RAM にロックできます。ダミー書き込みにより、クリティカル セクションでコピー オン ライト ページ フォールトが発生することさえありません。

このシステム コールは、到達する最大スタック サイズを推測できないため、スタックのページをロックできないことを理解しています。しかし、上に表示されている男性の最初の部分が、スタックに対しても行われていると言っているのはなぜですか? このマニュアル ページに誤りがありますか?それとも、初期スタック サイズに対してロックが行われているということですか?

4

4 に答える 4

5

はい、ロックは現在のスタック ページに対して行われますが、将来の可能性のあるすべてのスタック ページに対して行われるわけではありません。

于 2012-04-04T19:31:31.347 に答える
2

それはその最初の文で説明されています:

mlockall()呼び出しプロセスのアドレス空間にマップされたすべてのページをロックします。

そのため、ページがマップされている場合、そのページはロックされます。そうでなければ、そうはなりません。

于 2012-04-04T19:29:22.627 に答える
1

実際、mm/mlock.c のソース コードをざっと読んだだけでは、現在マップされているすべてのページを単純にロックしていると言えます。

static int do_mlockall(int flags)
{
        struct vm_area_struct * vma, * prev = NULL;
        unsigned int def_flags = 0;

        if (flags & MCL_FUTURE)
                def_flags = VM_LOCKED;
        current->mm->def_flags = def_flags;
        if (flags == MCL_FUTURE)
                goto out;

        for (vma = current->mm->mmap; vma ; vma = prev->vm_next) {
                vm_flags_t newflags;

                newflags = vma->vm_flags | VM_LOCKED;
                if (!(flags & MCL_CURRENT))
                        newflags &= ~VM_LOCKED;

                /* Ignore errors */
                mlock_fixup(vma, &prev, vma->vm_start, vma->vm_end, newflags);
        }
out:
        return 0;
}

larsmans が言ったことにもかかわらず、MCL_FUTURE も指定されている場合、将来のすべてのページにも適用されると思います。その場合、'current->mm->def_flags が更新され、VM_LOCKED が含まれるようになります。

于 2012-04-04T19:46:47.950 に答える
1

スタック メモリはヒープ メモリとは別にマップされるため、元の文ではスタックについて言及しているだけです。スタックに特別な処理はありません。マップされている場合はロックされ、マップされていない場合はロックされません。したがって、引用した 2 番目のセクションで述べられているように、スタックを呼び出す前にコードを実行している間に到達する最大サイズまでスタックを拡大することが重要ですmlockall

于 2012-04-04T19:35:03.110 に答える