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

Does kernel have its own stack (not kernel thread)? And how to read the `vm_map` structure of kernel in FreeBSD?

我需要找到 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(以页为单位,而不是字节)。