Chinaunix
标题:
小白问题:关于内核栈的起始位置
[打印本页]
作者:
willcream
时间:
2015-09-19 02:31
标题:
小白问题:关于内核栈的起始位置
问题很小白,求轻喷。。我们都知道内核栈的起始地址为:
task_struct = (struct task_struct *) STACK_POINTER & 0xffffe000;
stack_pointer不是栈顶指针吗?栈顶指针是移动的,就是会变化的,那task_struct岂不是也会跟着变吗?
作者:
魔鬼的惊叹
时间:
2015-09-19 11:36
task_struct的空间加上栈的空间也就4K,上面的代码明显是4K对齐嘛
作者:
willcream
时间:
2015-09-19 16:28
回复
2#
魔鬼的惊叹
小弟新手愚笨
还望详述
作者:
夕阳下的孤影
时间:
2015-09-20 14:38
你看的是哪一版的代码?什么平台?
我貌似从来没有见过这样用
作者:
willcream
时间:
2015-09-20 15:02
回复
4#
夕阳下的孤影
task_struct = (struct task_struct *) STACK_POINTER & 0xffffe000;
复制代码
This is exactly how the above pseudo-code is implemented in C under Linux:
/* cut-and-pasted from
linux/include/asm-i386/current.h */
static inline struct task_struct * get_current(void)
{
struct task_struct *current;
__asm__(-andl %%esp,%0;
-:-=- (current) : "0" (~8191UL));
return current;
}
复制代码
作者:
tpopusher
时间:
2015-09-20 15:40
回去好好看书, 很明显, 后面8K有效, task和内核stack共用一个8K页面, 所有在kenel中调用函数过深就会溢出覆盖task
作者:
flynetcn
时间:
2015-09-20 17:22
看什么书
回复
6#
tpopusher
作者:
nswcfd
时间:
2015-09-21 11:20
栈顶是随时在变,但是有约束,必须在内核栈(2K或4K)的范围内。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2