Каково состояние стека ядра процесса Linux при создании процесса? - PullRequest
11 голосов
/ 05 ноября 2011

Я не могу найти эту информацию нигде.Куда бы я ни посмотрел, я нахожу вещи, относящиеся к тому, как выглядит стек после того, как вы нажмете «main» (независимо от того, какая у вас точка входа), что будет аргументами программы и средой, но я ищу то, как система настраиваетстек для взаимодействия с макросом switch_to.В первый раз, когда задача переключается, она должна иметь EFLAGS, EBP, регистры, которые GCC сохраняет, и адрес возврата из функции schedule () в стеке, на который указывает "tsk-> thread-> esp",но я не могу понять, как ядро ​​настраивает этот стек, поскольку он позволяет GCC сохранять регистры общего назначения (используя выходные параметры для встроенной сборки).

Я имею в виду только ПК с архитектурой x86.Я исследую систему планировщика / процесса Linux для своего собственного небольшого ядра, которое я (пытаюсь) написать, и я не могу понять, чего мне не хватает.Я знаю, что чего-то не хватает, поскольку тот факт, что Slackware работает на моем компьютере, является свидетельством того, что планировщик работает: P

РЕДАКТИРОВАТЬ: Я, кажется, сформулировал это плохо.Я ищу информацию о том, как настраивается стек задач kernel , а не о том, как задается задача user .Точнее говоря, стек, на который указывает tsk-> thread-> esp и который переключается на "switch_to".

Ответы [ 3 ]

6 голосов
/ 13 ноября 2011

Начальный стек ядра для нового процесса установлен в 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 являются указателем стека ядра нового потока и указателем инструкций соответственно.

Обратите внимание, что это делает not поместите туда сохраненные %eflags, %ebp и т. Д., Поскольку, когда вновь созданный поток выполнения впервые переключается на, он начинает выполняться с ret_from_fork (это то, где __switch_to() возвращаетдля нового потока), что означает, что не выполняет вторую половину процедуры switch_to().

2 голосов
/ 06 ноября 2011

Google для «запуска процесса компоновки стека Linux» дает эту ссылку: «Состояние запуска двоичного файла ELF Linux / i386», которая описывает настройку, которую ядро ​​выполняет непосредственно перед передачей управления в libc код запуска.

2 голосов
/ 06 ноября 2011

Состояние стека при создании процесса описано в приложении X86-64 SVR4 ABI (для AMD64, то есть 64-битных машин x86-64). Эквивалент для 32-битного процессора Intel, вероятно, ABI i386 . Я настоятельно рекомендую прочитать также Assembly HOWTO . И, конечно, вам следует прочитать соответствующий файл ядра Linux.

...