Для класса, который я посещаю, я выполняю некоторую работу непосредственно с системным вызовом clone()
в Linux.Мне стало интересно, как это работает на самом деле, и я начал копать.Что меня смущает, так это то, что он, похоже, опирается на те же основы, что и функциональность fork()
(они вызывают одну и ту же функцию do_fork()
, хотя и с разными аргументами).С одной стороны, это имеет смысл для меня, поскольку поток - это на самом деле простой процесс, но у меня всегда было впечатление, что между созданием потока и способом создания процесса были некоторые существенные различия.Я немного покопался в реализации do_fork()
, а затем copy_process()
(который do_fork()
вызывает), но не смог убедить себя, что понимаю, что происходит.
Итак, для гуру, я что-то упускаю или это действительно так работает?Существуют ли флаги, которые в основном сообщают ОС только о том, сколько копировать, а также о том, с какой инструкции начинать выполнение новой задачи (я думаю, ответ должен быть да , но я просто неточно, как они переводятся)?
Ниже приведен код, на который я смотрю, возможно, вы могли бы объяснить, как аргументы, которые передаются в управление при создании легкого или тяжелого процесса, создаются.
asmlinkage int sys_fork(struct pt_regs *regs){
#ifdef CONFIG_MMU
return do_fork(SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL);
#else
/* can not support in nommu mode */
return(-EINVAL);
#endif
}
asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp,
int __user *parent_tidptr, int tls_val,
int __user *child_tidptr, struct pt_regs *regs)
{
if (!newsp)
newsp = regs->ARM_sp;
return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, child_tidptr);
}
Спасибо!