2015-11-27 8 views
5

Linuxカーネルでは、プロセスのメモリ領域を格納するために、Linuxはリンクリストと赤黒のツリーの両方を使用します。 find_vmaは、渡されたアドレスよりもvm_endフィールドが赤色の黒色のツリーを介している第1のメモリ領域を特定する機能である。しかし、find_vma()内の赤い黒いツリーの保護(ロックのような)がないことがわかります。別のスレッドがrb_erase関数を呼び出すと、同じツリー上のいくつかの要素が削除されますか?は保護されていないカーネルの赤い黒いツリーですか?

+0

RCUで管理していませんか? – Joe

+0

'find_vma'自体は、同時アクセス(変更)からいくらか保護して呼び出されるべきです。 @ジョー:リストとは異なり、rb-treeはRCUで保護することはできません。 – Tsyvarev

+0

@Tsyvarevご返信ありがとうございます。仰るとおりです。たとえば、[sys_msync](http://lxr.free-electrons.com/source/mm/filemap.c?v=2.4.37#L2381)( 'msync'のシステムコール)では、' down_read (&current-> mm-> mmap_sem) 'を探し、次に' find_vma'を実行します。赤い黒い木を保護していますか? – HuangJie

答えて

2

はい、find_vma関数呼び出しは、セマフォ経由の並行アクセスから保護されています。 スケジューラでは、関数もセマフォ呼び出しで使用されます。

 2209   down_read(&mm->mmap_sem); 
     2210   vma = find_vma(mm, start); 
     .... 
        up_read(&mm->mmap_sem); 



    mmap_sem is used to protect this function call which is a read-write semaphore. 
    struct rw_semaphore mmap_sem; defined inside struct mm_struct. 
関連する問題