本文节选自《实验指导手册》第二版第16.7章
实验指导手册是奔跑吧Linux内核入门篇第二版配套实验书,pdf版本已经release,可以免费下载和自由打印!
下载方法:
登陆“奔跑吧linux社区”微信公众号,输入“奔跑吧2”获取下载地址。
本文是《奔跑吧Linux内核 入门篇》第二版中第16章的实验16-5:进程实验。我们在前面的实验中已经完成了printk打印函数以及时钟中断的实验了,接下来我们就可以来完成进程创建的实验了。在本实验里,我们要研究进程是如何创建的,了解新创建的进程是如何执行的。在这个实验里,我们要完成fork()函数,看看传说中的fork函数究竟是如何实现的。
实验指导手册 打印小Tips:
大家可以在某宝上随便找一个便宜的打印店,打印B5+黑白即可!很便宜,20~30元,还包邮!
1.实验目的
(1)了解进程控制块的设计与实现。
(2)了解进程的创建/执行过程。
2.实验要求
实现fork函数以创建一个进程,该进程一直输出数字“12345”。
3.实验提示
(1)设计进程控制块。
(2)为进程控制块分配资源。
(3)设计和实现fork函数。
(4)为新进程分配栈空间。
(5)看看新创建的进程是如何运行的。
4.实验详解
4.1 进程控制块PCB
我们使用struct task_struct数据结构来描述一个进程控制块。
struct task_struct {
enum task_state state;
enum task_flags flags;
long count;
int priority;
int pid;
struct cpu_context cpu_context;
};
State:表示进程的状态。使用enum task_state枚举类型来列举出进程的状态,有运行状态TASK_RUNNING、可中断睡眠状态TASK_INTERRUPTIBLE、不可中断的睡眠状态TASK_UNINTERRUPTIBLE、僵尸态TASK_ZOMBIE以及终止态TASK_STOPPED。
enum task_state {
TASK_RUNNING = 0,
TASK_INTERRUPTIBLE = 1,
TASK_UNINTERRUPTIBLE = 2,
TASK_ZOMBIE = 3,
TASK_STOPPED = 4,
};
Flags用来表示进程的某些标志位。目前只用来表示进程是否为内核线程。
enum task_flags {
PF_KTHREAD = 1 << 0,
};