第六周 linux内核进程的创建

1.task_struct数据结构分析

  对于linux而言,每个进程都有一个进程控制PCB(process control block)来保存每个进程的相关信息。其中task_struct则是PCB的具体的数据结构通过内核代码可以发现,内核当中定义一个task_struct的结构体用来保存进程的相关信息。这里先来分析下task_struct的结构体。task_struct的代码如下:

  http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235

 1 #define  TASK_RUNNING       0
 2 #define TASK_INTERRUPTIBLE  1
 3 #define TASK_UNINTERRUPTIBLE    2
 4 #define __TASK_STOPPED      4
 5 #define __TASK_TRACED       8
 6 /* in tsk->exit_state */
 7 #define EXIT_DEAD       16
 8 #define EXIT_ZOMBIE     32
 9 #define EXIT_TRACE      (EXIT_ZOMBIE | EXIT_DEAD)
10 /* in tsk->state again */
11 #define TASK_DEAD       64
12 #define TASK_WAKEKILL       128
13 #define TASK_WAKING     256
14 #define TASK_PARKED     512
15 #define TASK_STATE_MAX      1024

这里可以看到定义了进程的相关运行状态,这里特殊的地方在于TASK_RUNNING这里将运行态和就绪态的进程都用TASK_RUNNING表示。

进程状态之间切换如下

1 pid_t pid;
2 pid_t tgid;

pid以及tpid的区别如下

http://blog.chinaunix.net/uid-26849197-id-3201487.html

简单说来,就是对于同一进程的不同线程而言pid不同,但是tgid相同

1 struct list {
2     struct list *next, *prev;
3 };

这里显示的内核进程链表的实现,内核通过这个链表实现进程间调度等等的功能。

1 struct task_struct __rcu *real_parent; /* real parent process */
2 struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */
3 /*
4  * children/sibling forms the list of my natural children
5  */
6 struct list_head children;    /* list of my children */
7 struct list_head sibling;    /* linkage in my parent‘s children list */
8 struct task_struct *group_leader;    /* threadgroup leader */

以上是进程之间父子关系的代码,通过这些代码,可以用来访问父进程以及子进程,这样在fork新进程时可以用来复制相关的数据。

1 union thread_union {
2     struct thread_info thread_info;
3     unsigned long stack[THREAD_SIZE/sizeof(long)];
4 };

每个进程都有8kb的内存用来存放 thread_info以及进程的内核堆栈

 1 * CPU-specific state of this task */
 2     struct thread_struct thread;
 3 /* filesystem information */
 4     struct fs_struct *fs;
 5 /* open file information */
 6     struct files_struct *files;
 7 /* namespaces */
 8     struct nsproxy *nsproxy;
 9 /* signal handlers */
10     struct signal_struct *signal;
11     struct sighand_struct *sighand;

这段这是表示CPU的工作状态,以及文件系统和文件描述符的管理

1 struct mm_struct *mm, *active_mm;

这里则是进程的内存管理

时间: 2024-11-01 14:21:37

第六周 linux内核进程的创建的相关文章

通过fork函数创建进程的跟踪,分析linux内核进程的创建

作者:吴乐 山东师范大学 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验过程 1.打开gdb,设置断点 2.跟踪到do_fork处 3.跟踪到copy_process断点处. 4.跟踪到ret_from_fork子进程创建完成. 二.代码部分分析 Fork的系统调用代码在linux/arch/i386/kernel/process.c中:       asmlinkage int sys_fork(s

LINUX内核分析第六周学习总结——进程的描述和进程的创建

LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.知识概要 进程的描述 进程描述符task_struct数据结构(一) 进程描述符task_struct数据结构(二) 进程的创建 进程的创建概览及fork一个进程的用户态代码 理解进程创建过程复杂代码的方法 浏览进程创建过程相关的关键代码 创建的新进程是从哪里开始执行的

Linux内核及分析 第六周 分析Linux内核创建一个新进程的过程

实验过程 1.github上克隆相应的mengning/menu.git 2.测试menuOS,测试fork直接执行结果 3.配置调试系统,进入gdb调试,利用file linux-3.18.6/vmlinux和target remote:1234来配置加载初始调试环境 4.在linux内核进程创建可能用到的点设置断点分别为sys_clone,do_fork,dup_task_struct,copy_thread,copy_process和ret_from_fork. 总结: 1.通过调用do_

《Linux内核分析》第六周学习笔记

<Linux内核分析>第六周学习笔记 进程的描述和创建 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [学习视频时间:1小时 撰写博客时间:2小时] [学习内容:进程创建的过程.使用gdb跟踪分析内核处理函数sys_clone] 一.进程的描述 1.1 进程描述符task_struct数据结构(一) 1. 进程控制块PCB——task_struct 为了管理进程,内核

linux学习第六周总结

linux学习第六周总结 本周共学习4项内容,简单总结一下 shell脚本编程进阶 系统启动和内核管理 selinux 文本处理三剑客之awk 一.shell脚本进阶 编程中的逻辑处理: 顺序执行选择执行循环执行 循环执行 将某代码段重复运行多次重复运行多少次循环次数事先已知循环次数事先未知有进入条件和退出条件r, while, until for循环for 变量名 in 列表;do循环体done执行机制:依次将列表中的元素赋值给"变量名"; 每次赋值后即执行一循环体; 直到列表中的元

Linux内核分析第六周作业

分析Linux内核创建一个新进程的过程 首先更新MenuOS的代码,加入调用fork的命令.吐槽一句,实验楼免费用户无法连网.还好只要去github复制一段代码即可 先观察一下fork命令的实现 1 int Fork(int argc, char *argv[]) 2 { 3 int pid; 4 /* fork another process */ 5 pid = fork(); 6 if (pid<0) 7 { 8 /* error occurred */ 9 fprintf(stderr,

Linux内核分析:实验六--Linux进程的创建过程分析

刘畅 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本次实验在MenuOS中加入fork系统调用,并通过GDB的调试跟踪,近距离的观察Linux中进程创建的过程.阅读Linux进程部分的源码,结合起来理解Linux内核创建新进程的过程. Linux中对进程的描述 Linux中task_struct结构体用于描述系统中的进程,对应x86机器的此结构体定义放在了/include/li

linux六周第二次课(3月13日)笔记

六周第二次课(3月13日)9.4sed(上)9.5sed (下) 9.4sed(上) 匹配到会连续打印两次 不想把无关的打印出来,加-N. 需要脱意符 不加脱意符,-n后面要加r 匹配两次O 打印出文件第2-5行的用法 打印出文件所有行的用法 打印出包含某个字符的行 9.5sed (下)set区分大小小的用 编辑文件 加入一行 半年的日志,删除前五个月,只留最后一个月.根据时间,用grep查行数.用vim打开文件,非常耗费内存,用set可以直接删掉. 删除带有user的行 替换功能 加上r才能生

Linux学习笔记第六周第四次课(3月15日)

六周第四次课(3月15日) 复习 扩展 打印某行到某行之间的内容http://ask.apelearn.com/question/559 按关键词打印内容,#sed -n '/\[abcd\]/,/\[rty\]/'p test 按行数打印内容,# sed -n '4,8'p test sed转换大小写 http://ask.apelearn.com/question/7758 sed中,使用\u表示大写,\l表示小写 1. 把每个单词的第一个小写字母变大写: sed 's/\b[a-z]/\u