周子轩 原创作品 转载请注明出处

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

一、视频笔记

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的详细描述,可参见task_struct结构描述

当然除了应该了解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等
  • 等等吧;
3. 子进程的执行
刚fork出来的子进程是从ret_from_fork开始执行的,然后跳转到syscall_exit(http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/kernel/entry_32.S#290),从系统调用中返回。看下面的源代码截图:
 
 
从用户态代码来看,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
一切正常的话,这时候我们简易的内核系统就启动起来了,这menuos种,输入help,就可以看到新添加的命令fork,输入fork,看看效果吧,有图为证:

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内核分析6的更多相关文章

  1. linux内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程

    1. 实验目的 选择一个系统调用(13号系统调用time除外),系统调用列表,使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 分析汇编代码调用系统调用的工作过程,特别是参数的传递的方 ...

  2. Linux内核分析作业7:Linux内核如何装载和启动一个可执行程序

            1.可执行文件的格式 在 Linux 平台下主要有以下三种可执行文件格式: 1.a.out(assembler and link editor output 汇编器和链接编辑器的输出) ...

  3. linux内核分析作业6:分析Linux内核创建一个新进程的过程

    task_struct结构: struct task_struct {   volatile long state;进程状态  void *stack; 堆栈  pid_t pid; 进程标识符  u ...

  4. linux内核分析作业5:分析system_call中断处理过程

    1.增加 Menu 内核命令行 调试系统调用. 步骤:删除menu git clone        (tab) make rootfs 这就是我们将 fork 函数写入 Menu 系统内核后的效果, ...

  5. linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作

    一.实验 使用gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与他人雷同 int g(int x) { return x + 3; } in ...

  6. linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核代码

    计算机如何工作 三个法宝:存储程序计算机.函数调用堆栈.中断机制. 堆栈 函数调用框架 传递参数 保存返回地址 提供局部变量空间 堆栈相关的寄存器 Esp 堆栈指针  (stack pointer) ...

  7. linux内核分析作业3:跟踪分析Linux内核的启动过程

    内核源码目录 1. arch:录下x86重点关注 2. init:目录下main.c中的start_kernel是启动内核的起点 3. ipc:进程间通信的目录 实验 使用实验楼的虚拟机打开shell ...

  8. linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...

  9. 《Linux内核分析》期末总结

    Linux内核设计期中总结 版权声明:本文为博主原创文章,未经博主允许不得转载. 前八周博客汇总及总结 Linux内核设计第一周——从汇编语言出发理解计算机工作原理 我们学习了汇编语言的基础知识,这一 ...

  10. 《Linux及安全》期中总结&《Linux内核分析》期终总结

    [5216 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK NINE ...

随机推荐

  1. [备忘]Windows Server 2008 R2部署FTP FileZilla Server防火墙设置

    有一台服务器,之前文件迁移少,现准备用FileZilla Server当FTP服务器,服务器系统是Windows Server 2008 R2,同样适用FileZilla Client连接服务器FTP ...

  2. python练习---小脚本

    一.爬子域名 #!/usr/bin/python # -*- coding: utf-8 -*- import requests import re import sys def get(domain ...

  3. Jmeter使用HTTP代理服务器录制脚本

    使用Jmeter录制脚本通常使用Badboy工具录制或者Jmeter自带的HTTP代理服务器录制脚本,这里说一下使用HTTP代理服务器录制时遇到的问题. 1.  Jmeter安装 下载得到Jmeter ...

  4. Spark之编程模型RDD

    前言:Spark编程模型两个主要抽象,一个是弹性分布式数据集RDD,它是一种特殊集合,支持多种数据源,可支持并行计算,可缓存:另一个是两种共享变量,支持并行计算的广播变量和累加器. 1.RDD介绍 S ...

  5. python sys模块使用详情

    python常用模块目录 sys模块提供了一系列有关Python运行环境的变量和函数.1.sys.argv可以用sys.argv获取当前正在执行的命令行参数的参数列表(list).变量解释sys.ar ...

  6. Beta冲刺第二周王者荣耀交流协会第四次会议

    1.例会照片: 成员:王超,高远博,冉华,王磊,王玉玲,任思佳,袁玥全部到齐. master:王玉玲 2.时间跨度: 2017年11月20日 18:00 — 18:13,总计13分钟. 3.地点: 一 ...

  7. JDK,JRE,JVM之间的关系

    JDK包括JRE包括JVM http://java-mzd.iteye.com/blog/838514

  8. 【IdentityServer4文档】- 使用密码保护 API

    使用密码保护 API OAuth 2.0 协议允许资源拥有者给客户端密码授权:客户端向令牌服务发送用户密码,以获取代表该用户的访问令牌. 该规范建议仅将“资源所有者密码授予”用于“可信”(或旧版)应用 ...

  9. 人生的第一篇blog

    开始写博客了,人生第一篇博客啊,要写些什么呢?想想也没有什么头绪,随便写写吧. 这学期要使用代码管理工具了,要写团队项目了.一直以来都是自己一个人在默默编程,没有过合作经历.对于代码的管理也只是一直在 ...

  10. Nodejs学习笔记(一)--- 操作Mysql数据库

    对于一门语言的学习,我个人觉得最好的方式就是通过一个项目来展示,所以从基本的一些模块去了解是最好的方式对于Mysql怎么去链接数据库这个我是在网上找到的(其实一直想找官方文档的,发现没有它的踪迹,(后 ...