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

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第七周作业>
    这个作业的目标 <gdb跟踪调用fork>
    作业正文 https://www.cnblogs.com/hyuxin/p/14012994.html

    实验六

    一、gdb跟踪调用fork函数的过程

    1.先删除原有的menu,再在github上克隆一份新的,使用mv把test.c覆盖掉,然后执行编译

    2.查看help可以看到多了fork命令

    3.跟上次的实验一样,用如下方式调试内核

    cd .. #返回到LinuxKernel目录下
    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s 
    


    4.然后在sys_clone,do_fork,dup_task_struct,copy_process,copy_thread和ret_from_fork设置断点:

    5.在gdb中continue执行到断点do_fork处

    6.然后执行命令n一直往下调试,可以看到执行到了copy_thread处

    二、fork函数分析

    fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。当使用fork()系统调用来创建一个新进程时,新进程的状态是TASK_RUNNING(就绪态,但是没有在运行)。当调度器选择这个新创建的进程运行时,新创建的进程就切换到运行态,它也是TASK_RUNNING。

    三、总结

    Linux系统中,进程的状态在就绪和运行状态都是task_running状态。是否运行取决于是否在CPU的时序上运行,跟windows中类似,当等待事件发生或者资源分配等,进程变为阻塞状态,事件发生或者等待的资源分配后转为就绪状态。进程都是用一个双向循环链表的结构链接起来的。每个进程通过pid标识来区分。第一个进程创建后,当要创建新的进程,先复制父进程的内容,然后修改寄存器、标识符等信息。然后,新 task_struct 结构的地址保存在链表中,而旧进程的 task_struct 结构内容被复制到新进程的 task_struct 结构中。

  • 相关阅读:
    golang 引用相对路径package
    LiteIDE 在 Windows 下为 Go 语言添加智能提示代码补全
    C#代码实现把网页文件保存为mht文件
    AE开发中关于 “无法嵌入互操作类型.........请改用适用的接口”问题的解决方法
    Windows下visual studio code搭建golang开发环境
    Eclipse配置开发Go的插件——Goclipse
    go语言条件语句 if else
    Go语言基础:method
    GO语言基础之method
    go中的接口
  • 原文地址:https://www.cnblogs.com/hyuxin/p/14012994.html
Copyright © 2011-2022 走看看