*参照元 [#je153adc] #backlinks *説明 [#g466dcc3] -パス: [[linux-2.6.33/mm/mlock.c]] -FIXME: これは何? --説明 **引数 [#rddb8e50] -unsigned long start -- -size_t len -- -int on -- **返り値 [#jf4bd499] -int -- **参考 [#h8d66186] *実装 [#n603eed1] static int do_mlock(unsigned long start, size_t len, int on) { unsigned long nstart, end, tmp; struct vm_area_struct * vma, * prev; int error; - --[[linux-2.6.33/vm_area_struct]] len = PAGE_ALIGN(len); end = start + len; if (end < start) return -EINVAL; if (end == start) return 0; - --[[linux-2.6.33/PAGE_ALIGN()]] vma = find_vma_prev(current->mm, start, &prev); if (!vma || vma->vm_start > start) return -ENOMEM; if (start > vma->vm_start) prev = vma; - --[[linux-2.6.33/find_vma_prev()]] - --[[linux-2.6.33/current(global)]] for (nstart = start ; ; ) { unsigned int newflags; /* Here we know that vma->vm_start <= nstart < vma->vm_end. */ newflags = vma->vm_flags | VM_LOCKED; if (!on) newflags &= ~VM_LOCKED; - --[[linux-2.6.33/VM_LOCKED]] tmp = vma->vm_end; if (tmp > end) tmp = end; error = mlock_fixup(vma, &prev, nstart, tmp, newflags); if (error) break; - --[[linux-2.6.33/mlock_fixup()]] nstart = tmp; if (nstart < prev->vm_end) nstart = prev->vm_end; if (nstart >= end) break; vma = prev->vm_next; if (!vma || vma->vm_start != nstart) { error = -ENOMEM; break; } } return error; } *コメント [#iee2d81b]