《Linux内核分析》第六周学习总结
《Linux内核分析》第六周学习总结
——进程的描述和进程的创建
姓名:王玮怡 学号:20135116
一、理论部分
(一)进程的描述
1、进程描述符task_stuck数据结构(一)
操作系统三大功能:进程管理(核心)、内存管理、文件系统
PCB task_struct中包含:进程状态、进程打开的文件、进程优先级信息
进程控制块PCB——进程描述符task_stuck提供了内核所需了解的进程信息
Linux进程状态转换图:
2、进程描述符task_stuck数据结构(二)
内核把进程的列表存放在任务队列的双向循环链表中
(1)非空双向链表结构
(2)空双向链表结构
(3)进程父子关系
(二)进程创建
1、进程的创建概览及fork一个进程的用户态代码
(1)进程的创建:start_kernel ...cpu_idle -->kernel_init和kthreadd -->0、1、2号进程(其中1号进程是所有用户线程的祖先,2号进程是所有内核线程的祖先)
(2)fork()系统调用:在用户态创建一个子进程
else if和else都会被执行:fork系统调用在父进程和子进程中各会返回一次,在子进程中pid的返回值为0,在父进程中的返回值为子进程的pid。
2、理解进程创建过程发杂代码的方法
创建新进程是通过复制当前进程来实现的,父、子进程大多数信息相同,但有些不同,如pid、内核堆栈等,并且只复制了一部分(内核堆栈栈底内容,SAVE_ALL部分)。
3、浏览创建进程的相关关键代码
(1)系统调用内核处理函数sys_fork、sys_clone、sysvfork:
fork、vfork和clone三个系统调用都可以创建一个新进程,而且都是通过调用do_fork来实现进程的创建。
(2)do_fork()
(3)copy_procrss()中dup_task_stuck()复制PCB
(4)alloc_thread_info_node()分配内核堆栈空间
(5)copy_thread()中
- struct pt_regs *childregs = task_pt_regs(p); //从子进程的pid(stack内核堆栈)找到其栈空间,SAVE_ALL地址
- *childregs = *current_pt_regs(); //拷贝当前进程(父进程)的内核堆栈的栈底(SAVE_ALL)的内容,内核堆栈已有数据的拷贝
4、创建的新进程是从哪里开始执行的
p->thread.ip = (unsigned long) ret_from_fork; //调度到子进程时的第一条指令
当子进程获得CPU的控制权开始运行, ret_from_fork可以使其出栈从iret返回到子进程用户态。
二、实验部分:使用gdb跟踪创建新进程的过程
1、启动MenuOS,并查看fork功能:
2、gdb调试fork指令
(1)qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
(2)在新打开的shell窗口中进程调试:
(3)设置断点
(4)在MenuOS中执行fork,就会发现fork函数停在了父进程中
(5)继续执行之后,停在了do_fork的位置
然后n单步执行,依次进入copy_process、dup_task_struct
按s进入该函数,可以看到dst = src(也就是复制父进程的struct)
(6)在copy_thread中,可以看到把task_pg_regs(p)也就是内核堆栈特定的地址找到并初始化
三、总结
Linux通过复制父进程来创建一个新进程,通过调用do_ fork来实现,并为新创建的进程动态分配一个task_ struct结构。
《Linux内核分析》第六周学习总结的更多相关文章
- 20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
- 21045308刘昊阳 《Java程序设计》第九周学习总结
21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...
- 《Java程序设计》第九周学习总结
20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...
- 20145236 《Java程序设计》第九周学习总结
20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...
- 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结
20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...
- 20155303 2016-2017-2 《Java程序设计》第二周学习总结
20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...
- 20145237 《Java程序设计》第九周学习总结
20145237 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令 ...
- 20175209 《Java程序设计》第九周学习总结
20175209 <Java程序设计>第九周学习总结 一.教材知识点总结 有关数据库下载中存在可能出现的问题已经在博客<数据库安装和使用过程中出现的一些问题>给出了相应的解决办 ...
- 20175313 张黎仙《Java程序设计》第九周学习总结
目录 学号 20175313 <Java程序设计>第九周学习总结 一.教材学习内容总结 二.教材学习中的问题和解决过程 三.代码托管 四.心得体会 五.学习进度条 六.参考资料 学号 20 ...
- 20175317 《Java程序设计》第九周学习总结
20175317 <Java程序设计>第九周学习总结 学前准备 首先下载XAMPP,下载完成后打开: 将前两个选项打开 在IDEA中配置驱动mysql-connector-java-5.1 ...
随机推荐
- tkinter内嵌Matplotlib系列(二)之函数曲线绘制
目录 目录 前言 (一)对matplotlib画布的封装: (二)思路分析: 1.需求说明: 2.框架的设置: 3.文件说明: (三)各文件的源代码 1.main.py 2.widget.py 3.f ...
- 第 16 章 C 预处理器和 C 库(直角坐标转换极坐标)
/*------------------------------------- rect_pol.c -- 把直角坐标转换为极坐标 ---------------------------------- ...
- Linux 小知识翻译 - 「桌面环境」
这次聊聊桌面环境. 上次聊了 X Window System 相关的内容,虽然令人意外,但X Window System 和桌面环境不是一回事.请大家稍微考虑一下. X Window System 是 ...
- fedora 配置使用点滴
fedora 配置使用点滴 fedora 16 无线网设置 fodera16是3.x的内核,无线网卡的驱动有点不一样. 可以用如下方法安装,需要先用有线网来安装几个包,步骤如下: 执行这个命令看看网卡 ...
- Beta冲刺(2/5)(麻瓜制造者)
今日完成任务 邓弘立:继续完成了昨天未完成的登录接口的重编码与测试. 李佳铭|:进一步完善了收藏UI 江郑: 对使用前端框架页面元素的进一步优化,基本功能进行中 刘双玉:部分图书馆租借接口修改 肖小强 ...
- MarkDown 排版测试
大标题 小标题(正常) 小标题(多一杠) 一级标题 二级标题 三级标题 四级标题(未空格) 四级标题(正常) 个人编程,写一个命令行程序 注册Github账号,建立项目仓库 添加ReadMe.md并编 ...
- vue文件在编辑器Sublime Text3中高亮
编写代码时,代码在编辑器中显示高亮,一方面,在感官方面使人觉得很舒服:另一方面,还可以提高开发效率.下面简单介绍vue文件在Sublime Text3 中高亮的vue插件的安装方法: 第一步:安装Pa ...
- linux之基本命令进阶
一 配置yum源管理与软件管理 yum常见工具 tree telent sl cowsay yum install tree #安装tree命令,以树形目录显示 #由于每次安装都有确认的提示,取 ...
- 用scrapy爬取亚马逊网站项目
这次爬取亚马逊网站,用到了scrapy,代理池,和中间件: spiders里面: # -*- coding: utf-8 -*- import scrapy from scrapy.http.requ ...
- Django之Template
模板层(template) 概念: 模板与html的区别: 模板=html+模板语法 模板语法: 1 变量: {{}} 深度查询: 通过句点符. 列表,字典 clas ...