Memory 内核是否有自己的堆栈(不是内核线程)?如何在FreeBSD中读取内核的“vm_map”结构?
我需要在FreeBSD x86_64下找到所有内核拥有的内存区域。一个选项是遍历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。它基本上满
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(以页面为单位,而不是字节为单位)