初学Linux进程的描述和进程的创建
来源:互联网 发布:电子商务平台软件下载 编辑:程序博客网 时间:2024/06/07 17:33
孙业毅 原创作品 转载请注明出处
《Linux内核分析》MOOC课程:http://mooc.study.163.com/course/USTC-1000029000
第六讲 进程的描述和进程的创建
@2015.04
一、理论知识
1. 进程描述符 task_struct
为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息。进程描述符task_struct的源码链接:http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235。其结构很庞大,初次接触我们只关注与进程创建与管理密切相关的一些字段。如:
- 进程的标识 pid
- 所有进程链表 struct list_head tasks;
- 程序创建的进程具有父子关系,在编程时往往需要引用这样的父子关系。进程描述符中有几个域用来表示这样的关系
- Linux为每个进程分配一个8KB大小的内存区域,用于存放该进程两个不同的数据结构:Thread_info和进程的内核堆栈
- struct thread_struct thread; //CPU-specific state of this task
当然除了应该了解task_struct中存储了哪些信息以外,还应该学习这些信息是如何组织的。比如所有的进程描述符是如何通过其内的一个数据成员 struct list_head tasks双向链接起来的,详见网上的一篇文章:linux 内核 task_struct 结构体字段分析
2. 进程的创建
在Linux应用程序的开发中,可以通过fork、vfork和clone等API来创建一个子进程,它们在Linux内核中对应的系统调用分别为sys_fork、sys_vfork和sys_clone函数,而这些函数最终都会调用do_fork完成子进程的创建。do_fork主要是复制了父进程的task_struct,然后修改必要的信息,从而得到子进程的task_struct。主要修改了以下信息:
- pid
- 进程链表
- 给新进程分配一个新的内核堆栈
- 修改子进程的IP为ret_from_fork,当子进程获得调度时就是从这里开始执行的
- 其它众多零碎字段的初始化,如运行时间设为0等
- 等等吧;
二、实验过程
实验仍然中实验楼的虚拟机里做,这真的是学习的一个好地方,不信,你来http://www.shiyanlou.com/courses/195。
1. 进入虚拟机,打开终端,这命令行依次敲入以下命令
- cd LinuxKernel
- rm menu -rf
- git clone https://github.com/mengning/menu.git
- cd menu
- mv test_fork.c test.c
- make rootfs
2. gdb上述的fork命令
关闭QEMU窗口,中命令行中输入:
qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd ../rootfs.img -s -S
再次启动MenuOS,并暂停等待gdb调试。
然后水平分割命令行窗口,这新窗口中依次输入以下命令,启动调试:
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
好了,继续运行程序吧,你会发现程序调试过程中,会停在这些断点处,然后你可以单步跟踪一些感兴趣的代码,从而验证我们刚刚学习到的Linux进程的创建过程!Enjoy it!
- 初学Linux进程的描述和进程的创建
- Linux的进程------进程的描述和进程的创建
- 进程描述和进程的创建
- Linux内核分析——进程的描述和创建
- 第六周 进程的描述和进程的创建
- LINUX内核分析第六周学习总结:进程的描述和进程的创建
- Linux内核分析(六):进程的描述和进程的创建
- Linux进程管理(1):进程描述和进程创建
- Linux进程管理(1):进程描述和进程创建
- Linux进程的创建和进程树
- Linux下的进程描述
- Linux内核分析之六——进程的描述与进程的创建
- Linux进程的创建
- Linux进程的创建
- Linux进程的创建
- Linux进程的创建和终结
- Linux------进程的创建和终结
- 【Linux】进程的创建执行和优先级
- android2.3.4增加gsensor
- [Leetcode] 138. Copy List with Random Pointer
- UVa 1225
- 从AndroidStudio的启动参数了解到的下JVM的一些东西(内存使用,JIT等)
- Android(4.2) Sensors 学习——G-sensor,Gyroscope驱动移植
- 初学Linux进程的描述和进程的创建
- 前端那些事儿(1) --- javascript模块化(上)
- Set Matrix Zeroes
- 织梦后台添加文章时,提示标题不能为空
- CStatic控件的基本使用
- 微信注册请求链接
- mac下安装memcache扩展出现问题
- C++内存分配方式 ——堆、栈、自由存储区、全局/静态存储区和常量存储区
- cocos2dx 3D战斗类游戏制作:【四】——一些零散笔记,3D小地图,android surfaceview等