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

Memory 内核是否有自己的堆栈(不是内核线程)?如何在FreeBSD中读取内核的“vm_map”结构?,memory,memory-management,kernel,driver,freebsd,Memory,Memory Management,Kernel,Driver,Freebsd,我需要在FreeBSD x86_64下找到所有内核拥有的内存区域。一个选项是遍历vm\u map\u条目,找到start\u addr和end\u addr作为K0-K1,K2-K3,K4-K5,K7-K8 正如我所注意到的,这些区域没有堆叠。我相信内核的堆栈非常有限,但是如何找到它的地址呢 另外,如何知道哪个vm\u映射是内核的。 例如,如何编写一个内核模块来读取内核vm_map?这并不能直接回答您的问题,但请看一下crashdump代码,即sys/kern/kern_dump.c。它基本上满

我需要在FreeBSD x86_64下找到所有内核拥有的内存区域。一个选项是遍历
vm\u map\u条目
,找到
start\u addr
end\u addr
作为
K0-K1
K2-K3
K4-K5
K7-K8

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

另外,如何知道哪个
vm\u映射是内核的。

例如,如何编写一个内核模块来读取内核
vm_map

这并不能直接回答您的问题,但请看一下crashdump代码,即sys/kern/kern_dump.c。它基本上满足了您的需要——它转储内核拥有的部分物理内存

至于栈——内核没有一个栈;每个线程都有一个内核堆栈,userland线程也有一个userland堆栈。内核堆栈实际上仅限于KSTACK_页面,通常为4(以页面为单位,而不是字节为单位)