linux内核创建进程流程
时间: 2023-10-22 14:04:01 浏览: 68
Linux内核创建进程的流程如下:
1. 创建一个task_struct结构体,这个结构体用于存储进程的信息,包括进程ID、进程状态、进程优先级、进程上下文等。
2. 初始化进程的内核栈,这个栈用于存储进程的运行时信息,比如寄存器值和函数调用栈。
3. 分配进程的一些资源,比如文件描述符、虚拟地址空间等。
4. 为进程分配一个进程组和一个会话(session),用于管理进程的权限和信号处理。
5. 将进程加入进程列表中,这个列表用于存储所有进程的task_struct结构体。
6. 根据进程的命令行参数和程序代码,为进程创建一个用户态的初始线程,也就是进程的main函数所在的线程。
7. 将进程状态设置为可调度状态,并将进程加入调度队列中,等待CPU分配时间片开始执行。
以上是Linux内核创建进程的基本流程,当然,在实际创建进程的过程中还有很多细节需要处理,比如fork()系统调用会创建一个子进程,而execve()系统调用会将当前进程替换成另一个进程等等。
相关问题
linux内核创建进程流程分析
当一个进程创建另外一个进程时,它需要执行以下步骤:
1. 调用系统调用 fork(),这会创建一个新的进程。
2. 内核为新进程分配一个进程标识符 (PID),并在内核中为该进程分配一个进程描述符 (task_struct 结构体)。
3. 内核将父进程的内存空间复制到子进程的内存空间中,包括代码段、数据段和堆栈段。这个过程称为写时复制 (copy-on-write)。
4. 父进程和子进程开始执行不同的代码,父进程继续执行 fork() 函数之后的代码,而子进程从 fork() 函数返回 0。
5. 子进程开始执行它自己的代码。
这是 fork() 的基本流程。需要注意的是,fork() 可能会失败,例如因为系统资源不足而无法为新进程分配足够的内存或进程描述符等。此时,fork() 函数会返回 -1。
linux内核启动流程详解
Linux内核的启动流程可以分为以下几个步骤:
1. 入口点确定:在链接文件vmlinux.lds中,通过ENTRY(stext)可以找到Linux内核的入口点,即stext。stext定义在arch/arm/kernel/head.S文件中。
2. 初始化设置:内核入口点stext首先会执行一些初始化设置,例如设置中断向量表、设置栈指针等。
3. 启动内核:接下来,stext会调用start_kernel函数,这是Linux内核的入口函数。start_kernel函数主要完成一些基本的系统初始化工作,例如初始化内核数据结构、设置页表等。
4. 创建init进程:在start_kernel函数中,会调用kernel_thread函数创建kernel_init进程,也就是init内核进程。init进程的PID为1。init进程最初是运行在内核态的,然后它会在根文件系统中查找名为"init"的程序,并通过运行这个程序实现从内核态到用户态的转变。
5. 初始化子系统:接下来,init进程会开始初始化各个子系统,例如内存管理子系统、进程管理子系统、设备驱动子系统等。每个子系统都有相应的初始化函数,用来初始化子系统的数据结构、注册设备驱动等。
6. 启动用户空间:在初始化子系统完成后,init进程会启动用户空间的第一个进程,通常是/bin/init或/sbin/init。这个进程会执行系统的初始化脚本,加载其他用户进程,并开始运行用户程序。
总之,Linux内核的启动流程包括入口点确定、初始化设置、启动内核、创建init进程、初始化子系统和启动用户空间等步骤。通过这些步骤,Linux内核能够完成系统的初始化和用户程序的加载,实现整个系统的正常运行。