进程
进程诞生
为了充分利用系统资源
init_idle
ldr r13, =__mmap_switched
__mmap_switched:
adr r3, __mmap_switched_data
.type __mmap_switched_data, %object
__mmap_switched_data:
.long init_thread_union + THREAD_START_SP @ sp
.size __mmap_switched_data, . - __mmap_switched_data
kernel_thread(kernel_init, NULL, CLONE_FS);
do_fork
kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
延后内核的创建工作, 将内核线程的创建工作交给一个内核线程来做, 即kthreadd 2号进程
fork, vfork和clone的系统调用的入口地址分别是sys_fork, sys_vfork和sys_clone, 而他们的定义是依赖于体系结构的, 而他们最终都调用了do_fork(linux-4.2之前的内核中是do_fork),在do_fork中通过copy_process复制进程的信息,调用wake_up_new_task将子进程加入调度器中
1. dup_task_struct中为其分配了新的堆栈
2. 调用了sched_fork,将其置为TASK_RUNNING
3. copy_thread(_tls)中将父进程的寄存器上下文复制给子进程,保证了父子进程的堆栈信息是一致的,
4. 将ret_from_fork的地址设置为eip寄存器的值
5. 为新进程分配并设置新的pid
6. 最终子进程从ret_from_fork开始执行
idle 内核线程
init 内核线程
init 用户线程
kthreadd 内核线程
0.进程属性相关
state : 进程状态
pid : 进程位移的进程标识符 .int类型
flag : 进程属性标志位,标识内核线程和用户进程
exit_code exit_signal : 进程退出值和终止信号,用于被父进程获取死亡原因
pthread_signal : 父进程消亡时发出的信号
comm : 存放可执行程序的名称
read_cred cred : 存放进程的认证信息
1.调度先关
prio : 进程动态优先级
static_prio : 静态优先级
normal_prio : 基于 static_prio 和调度策略计算出来的优先级
rt_priority : 实时进程的优先级
sched_class : 调度类
se : 普通进程调度实体
rt : 实时进程调度实体
dl : deadline 进程调度实体
policy : 进程的类型,比如普通进程还是实时进程
cpus_allowed: 进程可以在哪几个cpu 上运行
2. 内存相关
mm : 指向进程管理的内存的一个总的抽象的数据结构 mm_struct
3. 文件系统相关
fs : 指向文件系统信息
files : 指向进程的文件描述符表
4. 进程间通信
signal :
5. 网络相关 :
端口?
6. 进程关系相关
real_parent : 指向当前进程的父进程的 task_struct
children : 指向当前进程的子进程的链表
sibling : 指向当前进程的兄弟进程的链表
group_leader: 进程组的组长
运行 停止 死亡
创建 就绪 运行 阻塞 停止 死亡
linux_4.0/include/linux/sched.h +203
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define __TASK_STOPPED 4
#define __TASK_TRACED 8
#define EXIT_DEAD 16
#define EXIT_ZOMBIE 32
1. 内核线程的初始化,及内核线程到用户进程的转换
schedule_preempt_disabled();