我需要在 FreeBSD x86_64 下找到所有内核拥有的内存区域。一种选择是遍历vm_map_entry
并找到start_addr
和end_addr
,如K0-K1
、K2-K3
、K4-K5
、K7-K8
。
正如我注意到的,这些区域没有堆栈。我相信内核的堆栈非常有限,但是如何找到它的地址呢?
另外,如何知道哪个vm_map
是内核的。即如何编写内核模块来读取内核vm_map
的信息?
这不会直接回答您的问题,但请查看故障转储代码,即 sys/kern/kern_dump.c。 它基本上可以满足您的需求 - 它转储内核拥有的物理内存部分。
至于堆栈 - 内核没有单个堆栈;每个线程都有一个内核堆栈,用户空间线程也有一个用户空间堆栈。 内核堆栈确实被限制为 KSTACK_PAGES,通常为 4(以页为单位,而不是字节)。