zoukankan      html  css  js  c++  java
  • 2020-2021-1 20209313 《Linux内核原理与分析》第七周作业

    作业信息

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第七周作业>
    这个作业的目标 <分析进程的创建过程>
    作业正文 ... https://i.cnblogs.com/posts/edit;postId=13992141

    实验:gdb追踪do_fork函数

    cd LinuxKernel
    rm -rf menu
    git clone https://github.com/mengning/menu.git
    cd menu
    mv test_fork.c test.c
    make rootfs
    cd LinuxKernel
    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.omg -s -S
    gdb
    file linux-3.18.6/vmlinux
    target remote:1234
    b start_kernel
    b sys_clone
    b do_fork
    b dup_task_struct
    b copy_process
    b copy_thread
    b ret_from_fork
    b system_call
    








    二、分析进程创建过程

    (一)描述

    1、关键部分:进程内容、进程状态定义与转换、进程管理结构:双向链表

    • 进程描述符 struct task_struct

    成员说明:

    • 进程状态与转换

    • 进程管理结构:双向链表struct list_head

    (二)进程创建

    1、0号进程初始化,放在双向链表头
    2、内存管理
    复制进程描述符、复制其它进程资源(采用写时复制技术)、分配子进程的内核堆栈并对内核堆栈关键信息进行初始化。
    3、通过fork复制和生成其他进程

    保护中断现场,进入中断向量,查找并执行系统调用fork:
    复制pcb,创建内核堆栈,分配页面,
    修改pcb(包括文件信息,内存信息等等,其中特别重要的是,查找父进程和子进程的内存堆栈,复制父进程的部分内核堆栈到子进程,找到子进程的第一条指令地址,这样以来,子进程就是一个独立的进程),最ret_from_fork,这个命令最后会跳到syscall_exit,此时系统调用结束,中断结束,恢复中断现场,返回用户态。

    (三)三种调用do_fork函数的函数比较

    具体看:
    分析Linux内核创建一个新进程的过程
    1、差异
    fork、vfork、clone这三种系统调用的不同:参数不同、目的不同
    相同:都调用do_fork函数
    2、调用关系:
    libc fork() -> system_call -> sys_clone() -> do_fork()
    fork():子进程拷贝父进程的数据段,代码段,父子进程的执行次序不确定;
    vfork():创建的子进程与父进程共享数据段,而且子进程将先于父进程运行;
    clone():创建线程

  • 相关阅读:
    利用杨辉三角和阶乘计算组合数
    验证字符串是否为回文数
    利用线性同余产生伪随机数+可变参数使用
    根据RandomStr.java:使用类型转换生成六位验证字符串。
    Java语言基础问题
    从命令行输入参数值,输出求和值。
    愚公移山_节选(伪代码)
    CodeForces
    CodeForces
    E
  • 原文地址:https://www.cnblogs.com/assignment/p/13992141.html
Copyright © 2011-2022 走看看