在内核中查找未知类型内存的大小

时间:2016-03-12 01:27:31

标签: c memory freebsd

我有一个未知的void* bufferpointer。有没有找到缓冲区的内存大小。我无法访问malloc.h,但我可以访问Freebsd内核中的sys/malloc.h

1 个答案:

答案 0 :(得分:1)

在Linux内核中,如果你有指向某个虚拟内存的指针,它可以反转回struct page *以及struct vmap_areastruct vm_area_struct,它指示{{1}它指向的ed区域(从中你知道大小)。

操作系统需要这些反向映射,因为如果没有它们,它就不能执行诸如处理页面错误,然后映射内存,然后扩展自动增长映射之类的事情,如果有必要等等。

如果您怀疑地址是由mmap(内核拥有的内核虚拟内存分配器)分配的空间,您可以尝试vmalloc搜索红黑树find_vmap_area个区域,并返回指向vmalloc的指针。如果在那里找不到地址,那将为null。

如果您怀疑该地址是常规进程虚拟内存,那么struct vmap_area可能会找到它。它返回一个find_vma指针,如果查找失败,则为null。

这两个结构都为您提供有关包含地址的映射的起始和结束地址的信息。

您不会获得细粒度的信息,例如指针引用了多大的用户空间struct vma_struct *块。

此外,我不认为您可以将指向malloc的内存的随机地址反转为分配信息。