在内核中查找未知类型内存的大小
Find size of unknown type memory in kernel
我有一个未知 void* bufferpointer
。有没有找到缓冲区的内存大小。我无法访问 malloc.h
,但是我可以访问 Freebsd 内核中的 sys/malloc.h
。
在 Linux 内核中,如果你有指向某个虚拟内存的指针,它可以反转回 struct page *
以及 struct vmap_area
或 struct vm_area_struct
它指示它指向的 mmap
-ed 区域(从中你知道大小)。
操作系统需要这些类型的反向映射,因为如果没有它们,它就不能做这样的事情,哦,处理一个页面错误,然后映射内存,然后扩展一个自动增长的映射,如有必要等等。
如果您怀疑地址在 space 中由 vmalloc
分配(内核自己的内核拥有的虚拟内存分配器),您可以尝试 find_vmap_area
搜索红色 - vmalloc
区域的黑树和 returns 指向 struct vmap_area
的指针。如果在那里找不到地址,那将为 null。
如果您怀疑该地址是常规进程虚拟内存,那么 find_vma
也许能够找到它。它 returns 一个 struct vma_struct *
指针,如果查找失败则为 null。
这两个结构都为您提供有关包含地址的映射的起始地址和结束地址的信息。
您不会获得细粒度的信息,例如指针引用了多大的用户-space malloc
块。
此外,我认为您无法将指向来自 kmalloc
的内存的随机地址反转为分配信息。
我有一个未知 void* bufferpointer
。有没有找到缓冲区的内存大小。我无法访问 malloc.h
,但是我可以访问 Freebsd 内核中的 sys/malloc.h
。
在 Linux 内核中,如果你有指向某个虚拟内存的指针,它可以反转回 struct page *
以及 struct vmap_area
或 struct vm_area_struct
它指示它指向的 mmap
-ed 区域(从中你知道大小)。
操作系统需要这些类型的反向映射,因为如果没有它们,它就不能做这样的事情,哦,处理一个页面错误,然后映射内存,然后扩展一个自动增长的映射,如有必要等等。
如果您怀疑地址在 space 中由 vmalloc
分配(内核自己的内核拥有的虚拟内存分配器),您可以尝试 find_vmap_area
搜索红色 - vmalloc
区域的黑树和 returns 指向 struct vmap_area
的指针。如果在那里找不到地址,那将为 null。
如果您怀疑该地址是常规进程虚拟内存,那么 find_vma
也许能够找到它。它 returns 一个 struct vma_struct *
指针,如果查找失败则为 null。
这两个结构都为您提供有关包含地址的映射的起始地址和结束地址的信息。
您不会获得细粒度的信息,例如指针引用了多大的用户-space malloc
块。
此外,我认为您无法将指向来自 kmalloc
的内存的随机地址反转为分配信息。