一 关于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

最新文章

  1. 简约而不简单的Django新手图文教程
  2. IT人生知识分享:概率与运气
  3. 解决CentOS无法解析域名的问题
  4. swift 2.2 语法 (中)
  5. jsDoc的使用
  6. js windows对象
  7. Docker之功能汇总
  8. codeigniter db操作方法
  9. Oracle连接出现TNS:no listener或者ORA-12514: TNS:listener does not currently know
  10. Hadoop:使用原生python编写MapReduce
  11. memcached部署memcached环境及PHP扩展
  12. DataGridView减少闪烁的解决办法
  13. IOS网络开发实战(二)
  14. 【Python】Python的urllib模、urllib2模块的网络下载文件
  15. 开发过程遇到的bug
  16. mybatis中autoCommit自动提交事务
  17. dedecms自定义模型内容调用多个Ueditor
  18. Springboot中的事件Event
  19. WEB 服务器 加速缓存比较
  20. s5-11 距离矢量路由选择协议

热门文章

  1. T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)
  2. 参考__MySql
  3. js去除数组重复项
  4. django数据库的增删改查
  5. build.fxbuild打不开 Failed to create the part's controls
  6. 整理mac上的php环境
  7. NodeJS中的异步I/O、事件驱动
  8. 修改mysql密码
  9. for循环每次展示固定条数的数据的写法。
  10. MVC3 新建项目