1. task_struct 数据结构
task_struct
是 Linux 内核中表示进程的重要数据结构之一。它在内核中定义了进程的各种属性和状态信息,以及与进程管理相关的其他信息。task_struct
结构体定义在 <linux/sched.h>
头文件中,其结构如下(在不同版本的内核中可能会有些许变化):
struct task_struct {
volatile long state; // 进程状态
struct thread_info *stack; // 进程的内核栈
atomic_t usage;
int flags; // 进程标志
unsigned int ptrace;
struct task_struct *real_parent; // 真正的父进程
struct task_struct *parent; // 父进程
...
// 更多字段,用于存储进程的各种信息
};
-
state
: 用于表示进程的状态,如运行、等待、睡眠等。可能的取值包括TASK_RUNNING
(运行中)、TASK_INTERRUPTIBLE
(可中断等待)、TASK_UNINTERRUPTIBLE
(不可中断等待)等。 -
stack
: 指向进程的内核栈的指针,用于执行内核代码。 -
usage
: 用于引用计数,表示有多少进程引用了该task_struct
。 -
flags
: 包含有关进程属性的位标志,例如PF_EXITING
表示进程正在退出。 -
ptrace
: 用于跟踪进程的ptrace
标志,表示是否被其他进程跟踪。 -
real_parent
和parent
: 分别指向真正的父进程和当前父进程的task_struct
结构。
2.实验内容
执行以下代码
ls
cd ~/LinuxKernel
rm menu -rf
git config --global http.sslVerify false
git clone https://github.com/mengning/menu.git
cd menu
mv test_fork.c test.c
make rootfs //主要功能在于编译增加了fork文件
启用gdb
file linux-3.18.6/vmlinux
target remote:1234
b sys_clone
b do_fork
b dup_task_struct
b copy_process
b copy_thread
b ret_from_fork