*参照元 [#yf87b521] #backlinks *説明 [#te17df5e] -パス: [[linux-2.6.33/mm/vmalloc.c]] -FIXME: これは何? --説明 **引数 [#zc91f510] -const void *addr --マッピングを解除する領域の先頭アドレス。 --マッピングを解除する領域の先頭の仮想アドレス。 -int deallocate_pages --解放が必要(vmalloc で確保したページなど)なら 1、 そうでない(vmap でマッピングしたページなど)なら 0。 **返り値 [#af11e598] -なし **参考 [#u1eac875] *実装 [#a6a51e41] static void __vunmap(const void *addr, int deallocate_pages) { struct vm_struct *area; - --[[linux-2.6.33/vm_struct]] if (!addr) return; -NULL が指定された場合は何もしない。 if ((PAGE_SIZE-1) & (unsigned long)addr) { WARN(1, KERN_ERR "Trying to vfree() bad address (%p)\n", addr); return; } -ページサイズ境界に合わないアドレスを指定した場合、 エラーを表示する以外、何もしない。 - --[[linux-2.6.33/PAGE_SIZE]] - --[[linux-2.6.33/WARN()]] area = remove_vm_area(addr); if (unlikely(!area)) { WARN(1, KERN_ERR "Trying to vfree() nonexistent vm area (%p)\n", addr); return; } - --[[linux-2.6.33/remove_vm_area()]] - --[[linux-2.6.33/unlikely()]] debug_check_no_locks_freed(addr, area->size); debug_check_no_obj_freed(addr, area->size); - --[[linux-2.6.33/debug_check_no_locks_freed()]] - --[[linux-2.6.33/debug_check_no_obj_freed()]] if (deallocate_pages) { int i; -vmalloc で確保されたページなど、解放する必要がある場合。 for (i = 0; i < area->nr_pages; i++) { struct page *page = area->pages[i]; - --[[linux-2.6.33/page]] BUG_ON(!page); __free_page(page); - --[[linux-2.6.33/BUG_ON()]] - --[[linux-2.6.33/__free_page()]] } if (area->flags & VM_VPAGES) vfree(area->pages); else kfree(area->pages); - --[[linux-2.6.33/vfree()]] - --[[linux-2.6.33/kfree()]] } kfree(area); - --[[linux-2.6.33/kfree()]] return; } *コメント [#e163d115]