我正在使用Linux 3.12.10版本。我正在编写一个简单的模块,该模块遍历任务列表并检查每个进程的堆栈使用情况,以查看是否有任何堆栈溢出的危险。要获取该进程的堆栈限制,请使用:
tsk->signal->rlim[ RLIMIT_STACK ].rlim_cur
要获取堆栈开始处的内存地址,请使用:
tsk->mm->start_stack
然后我从中减去该宏的结果:
KSTK_ESP( tsk )
在大多数情况下,这似乎可以正常工作,但有时我遇到一种情况,即进程使用的内存超过了其堆栈限制(通常为8 MB),但是该进程继续运行并且Linux本身未报告任何类型的问题。
我的问题是,我是否使用正确的变量来检查此堆栈使用情况?
答案 0 :(得分:0)
经过更多研究,我想我已经意识到这不是确定使用了多少堆栈的好方法。当内核为该进程向堆栈分配更多的内存页时,就会出现问题。这些页面可能与其他页面不连续。因此,当前的堆栈指针可能是某个值,将导致无效的计算。
task-> mm-> stack_vm中的值可用于确定实际分配给进程堆栈的空间。这不像实际使用的那么准确,但是对于我来说,已经足够好了。