2016-03-12 56 views
1

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

+0

哪个内核?如何未知?你知道它是否是虚拟内存吗?等 – Kaz

+0

我不能从malloc使用这些函数,因为它在内核中,但我有权访问sys/malloc.h,它是malloc.h的有限版本。这是我使用的Freebsd。它不是虚拟内存,它只是一个用户空间缓冲区。 – lostdong12

+0

@ lostdong12 FreeBSD是否经常拥有物理地址为物理内存的“用户空间缓冲区”? – Kaz

回答

1

在Linux内核中,如果你有指向某个虚拟内存,它可以逆转回struct page *还有struct vmap_areastruct vm_area_struct这表明它所指向mmap -ed区域(从你知道的大小)。

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

如果你怀疑的地址是由vmalloc(内核自己的分配器内核拥有的虚拟内存)分配的空间,你可以尝试find_vmap_area其中通过vmalloc领域的红黑树搜索,并返回一个指向struct vmap_area。如果在那里找不到地址,那将是空的。

如果您怀疑该地址是常规进程虚拟内存,则find_vma也许能够找到它。它返回一个struct vma_struct *指针,如果查找失败,则该指针为null。

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

你不会得到细粒度的信息,比如一个用户空间malloc块被一个指针引用。

此外,我不认为你可以反转指向从kmalloc到分配信息的内存的随机地址。

+0

不知道你为什么接受这个,因为你的问题是关于FreeBSD的。 – Kaz