Захватываем ring 0 в Linux

       

ключевой фрагмент функции load_elf_library, содержащей ошибку синхронизации потоков


Как мы видим, семафор mmap_sem освобождается до вызова do_brk() функции, порождая тем самым проблему синхронизации потоков. В тоже время, анализ функции sys_brk(), убеждает нас в том, что функции do_brk() должна вызывается с взведенным семафором. Рассмотрим фрагмент исходного кода, позаимствованный из файла mm/mmap.c:

[1094]   vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
         if (!vma)         return -ENOMEM;                  vma->
vm_mm = mm;         vma->
vm_start = addr;         vma->
vm_end = addr + len;         vma->
vm_flags = flags;         vma->
vm_page_prot = protection_map[flags & 0x0f];         vma->
vm_ops = NULL;         vma->
vm_pgoff = 0;         vma->
vm_file = NULL;         vma->
vm_private_data = NULL;                  vma_link(mm, vma, prev, rb_link, rb_parent);



Содержание раздела