一 关于linux进程概念的补充

关于进程的基本概念这里不多说,把自己的学习所得作一些补充:

1. 在linux内核中,系统最多可以有64个进程同时存在。

2.linux进程包含的关键要素:一段可执行的程序;专用的系统堆栈空间;内核中它的控制块(进程控制块);独立的存储空间。

3. 系统的第一个进程由系统初始化生成。

4. 内核通过一个唯一的进程标识号PID来标识每个进程。

5. 用数据结构task_struct表示一个进程,包括进程的属性和状态。task_struct 结构中的指向前后进程的指针形成了task数组。

6. 当新进程生成时,linux为新进程分配一个task_struct结构,然后将指针保存在task数组中。

二 调试

  在前次实验的基础上,添加代码如下:

在menuos中运行结果,可以看到添加了fork命令:

设置断点:

程序停在第一个断点处:

模拟器显示:

继续运行,程序停在第二个断点处:

模拟器显示:

接着运行,停在第三个断点处:

第四个断点:

最后结果如上面的第二张图,不重复了。在menuos中命令行的方式输入fork,没有立即显示结果,在gdb中多次输入”c“后,打印pid信息。

三 分析总结

先附上一张自己理解的流程图:

自己的理解:

首先用户空间应用程序执行创建进程的系统调用fork(),vfork(),clone(),然后切换到内核空间(具体过程可见以前的博客),对于创建进程,内核都是执行的do_fork(),在do_fork()函数中调用函数copy_process(),该函数创建进程描述符以及子进程执行所需要的其他数据结构,初步复制父进程的信息如堆栈。但是子进程是从哪里开始执行的?从分析代码可知(p->thread.ip = (unsigned long) ret_from_fork;),子进程是从ret_from_fork标志处开始执行,在ret_from_fork 的末端执行了syscall_exit,结合上次的学习可知,该标志标识了从内核空间返回到内核空间过程。至此完成了fork()创建进程的过程。(细节还有待了解。。。)

by:方龙伟

原创作品 转载请注明出处

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

linux内核学习之六 进程创建过程学习的更多相关文章

  1. 《Linux内核分析》 week6作业-Linux内核fork()系统调用的创建过程

    一.进程控制块PCB-stack_struct 进程在操作系统中都有一个结构,用于表示这个进程.这就是进程控制块(PCB),在Linux中具体实现是task_struct数据结构,它主要记录了以下信息 ...

  2. 《Linux内核分析》第八周学习总结

    <Linux内核分析>第八周学习总结                                      ——进程的切换和系统的一般执行过程 姓名:王玮怡  学号:20135116 ...

  3. 《Linux内核分析》第七周学习总结

    <Linux内核分析>第七周学习总结                         ——可执行程序的装载 姓名:王玮怡  学号:20135116 一.理论部分总结 (一)可执行程序的装载 ...

  4. 《Linux内核分析》第六周学习总结

    <Linux内核分析>第六周学习总结                         ——进程的描述和进程的创建 姓名:王玮怡  学号:20135116 一.理论部分 (一)进程的描述 1 ...

  5. 《Linux内核分析》第八周学习笔记

    <Linux内核分析>第八周学习笔记 进程的切换和系统的一般执行过程 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163 ...

  6. 《Linux内核分析》第七周学习笔记

    <Linux内核分析>第七周学习笔记 可执行程序的装载 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/co ...

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

    <Linux内核分析>第六周学习笔记 进程的描述和创建 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/co ...

  8. 《Linux内核分析》第三周学习报告

    <Linux内核分析>第三周学习报告                                    ——构造一个简单的Linux系统MenuOS 姓名:王玮怡  学号:201351 ...

  9. 《Linux内核分析》第三周学习笔记

    <Linux内核分析>第三周学习笔记 构造一个简单的Linux系统MenuOS 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.stud ...

随机推荐

  1. Linux C++线程池

    .为什么需要线程池? 部分应用程序需要执行很多细小的任务,对于每个任务都创建一个线程来完成,任务完成后销毁线程,而这就会产生一个问题:当执行的任务所需要的时间T1小于等于创建线程时间T2和销毁线程时间 ...

  2. jquery总结06-动画事件01-基础显示和隐藏

    动画事件 .hide(option) 动画隐藏  会保存元素的原始属性值 $("#a2").hide({ duration: 3000, complete: function() ...

  3. 解决iphone5s,iphone6不能使用luajit及luac的问题

    做手游有小段时间了,感觉坤哥给这么多的机会.一直都比较忙项目的事,比较没时间去写点东西做点记录.想想还是写点开发问题记录比较好,可以很简短,也可以很有用. 我们项目采用的cocos2d-x的引擎,之前 ...

  4. Google Maps地图投影全解析(3):WKT形式表示

    update20090601:EPSG对该投影的编号设定为EPSG:3857,对应的WKT也发生了变化,下文不再修改,相对来说格式都是那样,可以到http://www.epsg-registry.or ...

  5. Jmeter学习(二)

    1. Jmeter预置知识-http协议 应用层协议http,ftp,smtp 1) http之url http 超文本传输协议,基于请求与响应模式的,无状态,应用层协议. http url: htt ...

  6. table布局的简单网页

    ---恢复内容开始--- 由于<body>标签的图片不能够拉伸, 解决办法: 1.图片不够大,又background属性不能拉伸图片: 2.只能用个div,把其z-index值设为负,并使 ...

  7. web开发必备插件

    文本编辑器百度ueditor:http://ueditor.baidu.com/website/

  8. LVS DR模式 负载均衡服务搭建

    LVS 负载均衡 最近在研究服务器负载均衡,阅读了网上的一些资料,发现主要的软件负载均衡方案有nginx(针对HTTP服务的负载均衡),LVS(针对IP层,MAC层的负载均衡).LVS模式工作在网络层 ...

  9. Greenlets间如何实现互相通信?

    Greenlets互相通信之Event 1.为什么引入Event: 2.Event是什么: 3.编程实例. 为什么引入Event 1.windows中有Events,作为线程间同步的方法: 2.Gev ...

  10. Sublime Text 3 快捷键汇总

    Sublime Text 3非常实用,但是想要用好,一些快捷键不可或缺,所以转了这个快捷键汇总. 用惯了vim,有些快捷键也懒得用了,尤其是在win下面,还有图形界面,所以个人觉得最有用的还是搜索类, ...