《Linux内核与分析》第六周

20135130王川东

1、操作系统的三大管理功能包括:进程管理,内存管理,文件系统。

2、 Linux内核通过唯一的进程标识PID来区别每个进程。为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息。每个进程的所有信息记录在了进程描述符(task_struct)中。struct  task_struct数据结构很庞大,包括进程状态、进程内核堆栈、进程打开的文件、进程优先级以及进程调度相关信息等等。这是一个包含了很多信息的结构体,也被称之为进程控制块(PCB)。

3、Linux中,PCB task_struct中不包含进程包含的线程列表信息。

4、Linux进程的状态与操作系统原理中的描述的进程状态似乎有所不同,比如就绪状态和运行状态都是TASK_RUNNING。这是因为在Linux中,所谓区别一个进程的状态是就绪还是运行,在于它是否得到了CPU的控制权。也就是说,这个进程是否在CPU上实际的执行,如果有实际执行,那就是运行,如果没有,哪怕目前是可以运行,也还只是就绪状态。

  注意,PCB task_struct中 存有进程链表,这是讲所有进程存在一个双向链表结构中。struct list_head tasks。

5、程序创建的进程具有父子关系,在编程时往往需要引用这样的父子关系。进程描述符中有几个域用来表示这样的关系。

6、Linux为每个进程分配一个8KB大小的内存区域,用于存放该进程两个不同的数据结构:Thread_info和进程的内核堆栈。进程处于内核态时使用, 不同于用户态堆栈,即PCB中指定了内核栈。内核控制路径所用的堆栈 很少,因此对栈和Thread_info 来说,8KB足够了

7、创建一个新进程在内核中的执行过程:fork、vfork和clone三个系统调用都可以创建一个新进程,而且都是通过调用do_fork来实现进程的创建;Linux通过复制父进程来创建一个新进程。从用户态的代码看fork();函数返回了两次,即在父子进程中各返回一次,父进程从系统调用中返回比较容易理解,子进程从系统调用中返回,那它在系统调用处理过程中的哪里开始执行的呢?Linux中,fork()系统调用产生的子进程在系统调用处理过程中从ret_from_fork处开始执行。

实验过程:

通过在myKernel中添加fork的功能,分析Linux内核创建一个新进程的过程。

添加后重新生成menu,并运行。

通过gdb调试,设置断点在sys_clone, do_fork, dup_task_struct, copy_process, copy_thread, ret_from_fork。运行menuOS中的fork,继续调试,查看断点处的代码情况

 创建新进程的过程分析:

创建的新进程是从哪里开始执行的:ret_from_fork
*childregs = *current_pt_regs();  复制内核堆栈(复制的pt_regs,是SAVE_ALL中系统调用压栈的那一部分。)
childregs->ax = 0;                               子进程的fork返回0

p->thread.sp = (unsigned long) childregs;        调度到子进程时的内核栈顶
p->thread.ip = (unsigned long) ret_from_fork;    调度到子进程时的第一条指令地址

 ip指向的是ret_from_fork,所以是从这里开始执行的。

Linux操作系统通过start_kernel,在调用的时候执行得到cpu_idle进程,后来通过kernel_init和kthreadd生成了0号进程和1号进程,分别作为最初的内核进程和用户进程。这里的进程最初是通过程序员具体在代码中设置的结构啊,信息啊之类的,而之后的进程则是复制之前的进程,这里可以看做是父进程,生成了新的进程,也就是子进程,当然,子进程的信息会有修改,它并不是跟父进程完全一样。

程序调用状态可以表示为:

fork具体工作过程:

1. 调用sys_clone

2. 执行do_fork(), fork、vfork和clone三个系统调用都可以创建一个新进程,而且都是通过调用do_fork来实现进程的创建。do_fork()负责进程的复制。

3. 执行copy_process

4 dup_task_struct,复制父进程的task_struct信息到新的task_struct里

fork会产生父子进程,在父进程中,返回值是子进程的进程号;在子进程中,返回值为0。因此可通过返回值来判断当前进程是父进程还是子进程。使用fork函数得到的子进程是父进程的一个复制品,它从父进程处复制了整个进程的地址空间,包括进程上下文,进程堆栈,内存信息,打开的文件描述符,信号控制设定,进程优先级,进程组号,当前工作目录,根目录,资源限制,控制终端等。

5.copy_thread

6.ret_from_fork

进程的用户栈的起始地址存储在task_struct结构的stack_start成员中,新进程是从ret_from_fork处开始执行的。对于fork执行处理过程来说,父子进程共享同一段代码空间,”一次调用,两次返回“,其实对于调用fork的父进程来说,如果fork出来的子进程没有得到调度,那么父进程从fork系统调用返回。再看fork出来的子进程,由 copy_process函数可以看出,子进程的返回地址为ret_from_fork(和父进程在同一个代码点上返回),返回值直接置为0。所以当子进 程得到调度的时候,也从fork返回,返回值为0。ret_from_fork()调用schedule_tail()函数,用存放在栈中的值再装入所有寄存器,并强迫CPU返回到用户态。这样,eax寄存器就装过两个值,一个是子进程的值0,一个是父进程的值——子进程的PID。然后在fork()、vfork()或clone()返回时,新进程将开始执行。在不同的进程中返回不同的值。

时间: 2024-12-17 22:06:23

《Linux内核与分析》第六周的相关文章

20145317《信息安全系统设计基础》第六周学习总结(1)

20145317<信息安全系统设计基础>第六周学习总结(1) 第四章 处理器体系结构 指令体系结构:一个处理器支持的指令和指令的字节级编码 4.1Y86指令集体系结构 Y86:包括定义各种状态元素.指令集和它们的编码.一组编程规范和异常事件处理. Y86程序中的每条指令都会读取或修改处理器状态的某些部分.Y86具体包括:8个程序寄存器.3个条件码ZF\SF\OF.程序计数器(PC) Y86用虚拟地址引用存储器位置. 程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态. 注意:条件

20145222《信息安全系统设计基础》第六周学习总结(1)

20145222<信息安全系统设计基础>第六周学习总结(1) 第四章 处理器体系结构 指令体系结构:一个处理器支持的指令和指令的字节级编码 4.1Y86指令集体系结构 · Y86:包括定义各种状态元素.指令集和它们的编码.一组编程规范和异常事件处理. · Y86程序中的每条指令都会读取或修改处理器状态的某些部分.· Y86具体包括:8个程序寄存器.3个条件码ZF\SF\OF.程序计数器(PC) · Y86用虚拟地址引用存储器位置. 程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状

第六周总结

个人篇: 第六周的学习主要是OOP最后的几章内容,内容都是相对于之前的基础更加的抽象,在学习的过程中应该更注重理解层次上,然后当然也要实战练习. ~~GUI的内容,讲Jtable和Jtree进行了学习,可以实现ATM机的表格查询和增加用户以及删减用户:制作了QQ聊天列表. ~~I/O流的学习,主要是掌握输入流和输出流的字节流包装成包装流,了解各种流的有点和缺点,在运用中实现写入和只读的,包括文件或者字符串.结合joi包的导入后,可以控制excel的写入和只读, 将excel模拟成数据库,然后用I

java第六周学习总结

学号20145336 <Java程序设计>第五周学习总结 教材学习内容总结 第十章 输入与输出 InputStream与OutputStream java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象.从程序角度来看,如果将数据从来源中取出,可以使用输入串流,如果将数据写入目的地可以使用输出串流.在java中,输入串流对象为java.io.InputStream实例,输出串流对象为java.io.OutputStream实例.流(Stream)是对「输入输出」的抽象,注意「

20145237第六周学习总结

20145237第6周学习总结 教材学习内容总结 第十章 •InputStream与OutputStream 流(Stream)是对「输入输出」的抽象. read:每次会尝试读入byte数组长度的数据,并返回实际读入的字节.为-1时即为未读取到数据. write:指定要写出的byte数组.初始索引与数组长度. •标准输入输出//这部分已经很熟悉了 System.in: 标准输入,默认关联到键盘(终端输入) System.out: 标准输出,默认关联到显示器(终端输出) System.err: 标

第六周周总结

在第六周中是忙碌的,对于高数,上课的内容也在快速的翻篇,我的大脑也在快速的运转着,讲概念的时候我很难理解过来,但是讲习题的时候勉勉强强能听的懂,每次在听不懂的地方我都会打个问号,以便于自己下课后方便问同学,我觉得这也是初中以来养成的一个好习惯吧,数学的作业真的太伤脑细胞了,往往要思考很久才能做出一题,但是做了不管对错也总比看着答案抄一遍答案好的多.自己对数学不会,可是有时候又很喜欢计算的这种题型,就觉得很好玩啊.我希望自己努力一把吧,争取期中的时候能考好点,要开始认真准备期中了. 讲讲专业课吧,

《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 为了管理进程,内核

【项目计划&#183;微信】第六周项目计划与分工

第六周项目计划与分工 制定时间:2014年10月26日 地点:逸夫馆研讨间02号 到场人:杨妍喆.林聪.周伯威.徐子茹 [已完成]第五周任务及分工 a.  调研与分析报告; b. 开发平台学习及分析;  c. Vision文档与用户故事修订 子茹和我调研产品,我们找到了四个主流的微信订票平台,我负责调研分析“艾迪票务”和“哈票网”,子茹负责"QQ订票"和“木偶剧场”: 周伯威负责开发平台的学习分析报告: 林聪负责Vision文档与用户故事的修订. 第六周任务及其分工 a. 配置相关的开

第十六周学习进度表

时间 第十六周 所花时间 10个小时左右 代码量 300行左右 博客量 1篇 了解到的知识点 网页版的显示作业

第十六周进度表

第十六周进度表 所花时间(包括上课) 10 代码量(行) 853 博客量(篇) 1 了解到的知识点 了解了有关Android开发的知识 了解了页面跳转功能的实现 了解了绩效管理和项目总结的知识