В текущем коде ядра (смотрю 2.6.24) добавлена проверка "if (addr != vma->vm_start || end != vma->vm_end)" не позволяющая примапить физич страницы в юзерспейсную vm_area если размер vm_area больше чем общая длмна этих страниц.
Раньше (в районе 2.6.10) это работало так: вместо страниц vm_area которые вылезли за предел примапливалась ZERO_PAGE и соотв при обращении к этим страницам (возникал page fault итд) юзерспейс получал доступные для записи страницы разделяемой памяти заполненные нулями.
как добиться такого же эффекта в текущих ядрах?
int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn, unsigned long size, pgprot_t prot)
{ ...
if (is_cow_mapping(vma->vm_flags)) {
if (addr != vma->vm_start || end != vma->vm_end){
return -EINVAL;
}
vma->vm_pgoff = pfn;
}
...