linux中的进程是个最基本的概念,进程从运行队列到开始运行有两个开始的地方,
一个就是switch_to宏中的标号1:"1:/t",//
只要不是新创建的进程,几乎都是从上面的那个标号1开始的,
而switch_to宏则是除了内核本身,所有的进程要 想运行都要经过的地方
另 一个就是ret_form_fork
这样看来,虽然linux的进程体系以及进程调度非常复杂,但是总体看来就是一个沙漏状,
对于系统中的每个新进程它首次被执行的过程必然是:
sys_fork---->do_fork---->copy_process ---->copy_thread 其中copy_process 设置的新进程的eip ret_from_fork --->放入就绪队列---->被调度---->执行switch_to
然后就到了
jmp __switch_to了,这是个函数,这个函数的返回地址就区分了被调度的进程是新创建的进程还是已经执行过的进程了。
新创建(没有被执行过)的进程的返回地址是ret_from_fork
已经执行过的进程的返回地址是:switch_to中的标号1:
switch_to宏就是沙漏中间那个 最细的地方,想从一端到另一端,必然要经过那个地方,在非新创建的进程的情况下,所有进程都是从标号1开始,
看一下switch_to宏:
#define switch_to(prev,next,last) do { /
unsigned long esi,edi; /
asm volatile("pushfl/n/t" /
"pushl %%ebp/n/t"
unsigned long esi,edi; /
asm volatile("pushfl/n/t" /
"pushl %%ebp/n/t"

本文详细探讨了Linux内核中的进程切换过程,重点分析了switch_to宏和ret_from_fork在进程创建及调度中的作用。通过讲解新进程如何从sys_fork开始,经过do_fork、copy_process,直至在switch_to宏中进行状态切换,揭示了Linux内核如何实现高效且统一的进程管理。同时,文章解释了为何不使用call指令以及为何新进程从ret_from_fork开始执行的原因。

2630

被折叠的 条评论
为什么被折叠?



