进程创建时的Linux进程内核堆栈状态是什么?
我无法在任何地方找到此信息。无论我看到什么,我都会发现一些事情指的是一旦你点击“主”(无论你的入口点是什么),这将是程序参数和环境,但是我要找的是系统如何设置该堆栈与switch_to宏配合使用。任务切换到第一次时,它需要具有EFLAGS,EBP,GCC保存的寄存器以及由“tsk-> thread-> esp”指向的堆栈上schedule()函数的返回地址,但我无法弄清楚内核如何设置这个堆栈,因为它让GCC保存通用寄存器(使用内联汇编的输出参数)。进程创建时的Linux进程内核堆栈状态是什么?
我指的只是x86个人电脑。我正在为我自己的小内核(我试图)编写Linux调度程序/进程系统进行研究,而且我无法理解我缺少的东西。我知道我失去了一些东西,因为事实上,Slackware的我的电脑上运行的是印证了调度工作的事实:P
编辑:我似乎已经严重措辞这一点。我正在寻找有关如何设置任务内核堆栈而不是如何设置任务用户任务的信息。更具体地说,tsk-> thread-> esp指向的堆栈以及“switch_to”切换到的堆栈。
为一个新进程的初始内核栈被设置在copy_thread()
,这是一个具体的拱形功能。 x86版本,例如,开始时是这样的:
int copy_thread(unsigned long clone_flags, unsigned long sp,
unsigned long unused,
struct task_struct *p, struct pt_regs *regs)
{
struct pt_regs *childregs;
struct task_struct *tsk;
int err;
childregs = task_pt_regs(p);
*childregs = *regs;
childregs->ax = 0;
childregs->sp = sp;
p->thread.sp = (unsigned long) childregs;
p->thread.sp0 = (unsigned long) (childregs+1);
p->thread.ip = (unsigned long) ret_from_fork;
p->thread.sp
和p->thread.ip
分别是新线程的内核堆栈指针和指令指针。
注意其不地方保存%eflags
,%ebp
等在那里,因为当执行一个新创建的线程先切换到,它开始了在ret_from_fork
(执行这就是__switch_to()
返回到一个新的线程),这意味着它不会执行switch_to()
例程的后半部分。
所述堆叠中的过程创建的状态在X86-64 SVR4 ABI补充说明(对于AMD64,即X86-64 64位的机)。 32位英特尔处理器的等效物可能是ABI i386。我强烈推荐阅读Assembly HOWTO。当然,你也许应该阅读相关的Linux内核文件。
这些页面描述**执行开始后堆栈的状态**。我的问题是**执行前的堆栈状态**。即内核正在设置堆栈时。我唯一的问题是Linux离开编译器保存通用寄存器(保存在堆栈中),但保存的方式可能因编译器而异,因此我对系统如何设置感到困惑最初的堆栈。我已经查看了代码,但我无法找到该进程被填充的位置。它隐藏在某处的机器抽象背后。 – Caleb1994
执行前堆栈不存在。所以我不明白你想要什么。内核正在构建ABI文档中描述的初始进程栈。 –
也许你忘了内核和用户空间堆栈是不同的? –
看起来你这里有两个不同的问题 - 在进程init 1)堆栈的状况; 2)内核'日程安排()'中的IRQ。您应该将这些问题中的一个作为新问题发布,并将其中的一个留在这里;这样你就可以在每个问题上得到专注的答案。在堆栈溢出中,为每个问题启动一个单独的问题是非常好的。 – 2011-11-05 18:30:03
好吧,会做的!我已经阅读了很长时间的答案/问题,但从未发布!感谢您的提示:) 那么,我会在大约5分钟。我必须等待:P – Caleb1994