内核有自己的堆栈(不是内核线程)吗?以及如何在 FreeBSD 中读取内核的 'vm_map' 结构



我需要在 FreeBSD x86_64 下找到所有内核拥有的内存区域。一种选择是遍历vm_map_entry并找到start_addrend_addr,如K0-K1K2-K3K4-K5K7-K8

正如我注意到的,这些区域没有堆栈。我相信内核的堆栈非常有限,但是如何找到它的地址呢?

另外,如何知道哪个vm_map是内核的。即如何编写内核模块来读取内核vm_map的信息?

这不会直接回答您的问题,但请查看故障转储代码,即 sys/kern/kern_dump.c。 它基本上可以满足您的需求 - 它转储内核拥有的物理内存部分。

至于堆栈 - 内核没有单个堆栈;每个线程都有一个内核堆栈,用户空间线程有一个用户空间堆栈。 内核堆栈确实被限制为 KSTACK_PAGES,通常为 4(以页为单位,而不是字节)。

最新更新