在Linux内核中,为了存储进程的内存区域,Linux使用链表和红黑树。 find_vma是一个函数,它定位第一个内存区域,其vm_end字段大于通过红黑树传递的地址。但是,我发现find_vma()中的红黑树没有保护(如锁)。如果另一个线程调用rb_erase函数同时删除树上的某个元素会怎么样?
答案 0 :(得分: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.