创建进程时Linux进程内核堆栈状态是什么?

Cal*_*994 11 linux x86 stack state kernel

我无法在任何地方找到这些信息.无论我到哪里,我都会发现,一旦你点击"主"(无论你的入口点是什么),这将是程序参数和环境,看起来堆栈的外观,但我正在寻找的是系统如何设置堆栈与switch_to宏配合.第一次切换到任务时,需要有EFLAGS,EBP,GCC保存的寄存器,以及来自"tsk-> thread-> esp"指向的堆栈上schedule()函数的返回地址,但是我无法弄清楚内核是如何设置这个堆栈的,因为它允许GCC保存通用寄存器(使用内联汇编的输出参数).

我指的是x86个人电脑.我正在为我自己的(尝试)编写的小内核研究Linux调度程序/进程系统,而我无法理解我所缺少的内容.我知道我遗漏了一些东西,因为Slackware在我的计算机上运行这一事实证明了调度程序的工作原理:P

编辑:我似乎措辞严厉.我正在寻找有关如何设置任务内核堆栈而不是如何设置任务用户任务的信息.更具体地说,tsk-> thread-> esp指向的堆栈,以及"switch_to"切换到的堆栈.

caf*_*caf 6

设置新进程的初始内核堆栈copy_thread(),这是一个特定于arch的函数.例如,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;
Run Code Online (Sandbox Code Playgroud)

p->thread.sp并且p->thread.ip分别是新线程的内核堆栈指针和指令指针.

请注意,它并没有放置保存%eflags,%ebp等在那里,因为当执行新创建的线程先切换到,它开始了在执行ret_from_fork(这就是__switch_to()返回到一个新的线程),这意味着它执行switch_to()例程的后半部分.