分析 Linux 内核创建一个新进程的过程

news/2024/11/15 12:12:34/文章来源:https://www.cnblogs.com/20202215zxp/p/18537087

张晓攀+原创作品转载请注明出处+《Linux内核分析》MOOC课程https://mooc.study.163.com/course/1000029000

实验六——分析Linux内核创建一个新进程的过程

一、实验过程

1.将github上的menu项目克隆下来

git clone https://github.com/mengning/menu.git

2.进入内核系统

更新test.c :mv test_fork.c test.c

运行脚本,自动编译和自动生成根文件系统,同时启动,输入fork命令:make rootfs

3.gdb调试

  • 关闭QEMU窗口,在命令行中输入命令:qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

  • 另开一个shell窗口,依次输入指令进入调试:gdbfile linux-3.18.6/vmlinuxtarget remote:1234

  • 设置断点

二、实验总结

在Linux内核中,创建一个新进程主要依赖于fork()clone()等系统调用,最终由内核中的do_fork()函数完成。简要流程如下:

1. 用户态的系统调用

  • 用户进程调用fork()vfork()clone()等接口。
  • 这些接口会触发进入内核态,通过系统调用号定位到相应的内核函数,例如sys_clone

2. 进入do_fork()

  • do_fork()是创建新进程的核心内核函数,它接收用户态的参数并进行处理。
  • 主要完成以下任务:
    1. 检查参数:确保clone_flags等参数有效。
    2. 分配task_struct:为新进程分配内存,并初始化其任务描述符task_struct,其中包含进程的关键信息,如PID、优先级、调度策略等。
    3. 复制父进程资源
      • 虚拟内存:使用copy_mm()复制父进程的内存描述符。
      • 文件描述符:通过copy_files()复制文件描述符表。
      • 信号处理:通过copy_sighand()复制信号处理机制。
  • 根据clone_flags决定是否与父进程共享某些资源(如地址空间、文件描述符表等)。

3. 分配PID

  • 内核通过alloc_pid()函数为新进程分配一个唯一的进程标识符(PID)。

4. 设置调度信息

  • 调用wake_up_new_task(),将新进程加入可运行队列,并设置其初始状态为TASK_RUNNINGTASK_INTERRUPTIBLE

5. 返回到用户态

  • 新进程的task_struct初始化完毕后,父子进程分别返回到用户态。
  • 对于父进程,fork()返回新进程的PID;对于子进程,fork()返回0。

6. 执行新任务

  • 如果新进程需要执行不同的程序,可以调用execve()加载新程序。
  • 如果是vfork()或某些clone()调用,父进程可能会等待子进程执行完成后才继续运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/829440.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 入门-1

1. Python安装python命令解释器官网地址:http://www.python.org版本:python3.xcustomize install,自定义安装 【英/ˈkʌstəmaɪz/】安装位置查看: Win +R —》cmd -》where python配置环境变量作用:帮助系统能够自动找到相应包的路径手动配置环境变量 右键此电脑 -》…

STL的状态字

什么叫状态字:如表:BR CC1 CC0 OV OS OR STA RLO /FC写:通常在官方手册上: -表示不进行读写, x表示对应位可以写入0/12个状态 1/0表示对应位的确定状态 *表示读取官方对于各个位的解释:首次检查位:状态字的0位称作首次检查位,如果/FC 位的信号状态为“0”,则表示伴随着…

P4156 论战捆竹竿 题解

论战捆竹竿 题意:给定字符串 \(s\),计数 "串 \(t\) 的长度" 可能的种数有多少种,使得 \(t\) 能被 \(s\) 作为印章印出来,且 \(|t|\le w\)。\(n=|s|\le 5\times 10^5\),\(n\le w\le 10^{18}\)。 第一步: 求出 \(s\) 的周期 \(\{a_1\sim a_m\}\),包含 \(n\)(\(…

有DEM,如何在Global Mapper中绘制等高线,并导出至CAD

通常,用无人机航测或其它途径得到的DEM、DSM来绘制等高线,一般流程是将DEM导出至南方CASS或其它格式的高程点文件,再用这些高程点来建立DTM、结三角网、编辑三角网,来进行等高线的绘制,做过等高线生产的测绘兄弟们都清楚,这个过程还是十分繁琐的。实际上,用Global Mappe…

2024-2025-1 20241318 《计算机基础与程序设计》第七周学习总结

这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK07这个作业的目标 ①数组与链表②基于数组和基于链表实现数据结构③无序表与有序表④树⑤图⑥子程序与参数作业正文 https…

坐标系相关知识科普

四/七参数计算方法及"傻瓜式"转换流程 坐标转换隶属于"大地测量学"的范畴,而大地测量学呢,又是整个测绘学科中最基础、最重要,但知识的理论性最强的一门学科。今天呢,测绘营地将尽量用通俗易懂的语言为大家讲解一下坐标系的区别、几种转换方式、中央子…

Living-Dream 系列笔记 第84期

连通性问题点双连通:在无向图中,删除一个点(不是 \(x\) 或者 \(y\))后,点 \(x\) 和点 \(y\) 仍然能够彼此到达,那么称 \(x\) 和 \(y\) 是点双连通的。边双连通:在无向图中,删除一条边后,点 \(x\) 和点 \(y\) 仍然能够彼此到达,那么称 \(x\) 和 \(y\) 是边双连通的。性质…

谷歌浏览器最好的视频下载器插件-CocoCut视频下载器

这是我目前遇到最好用的视频下载插件,没有之一。 教程如下:打开播放视频的页面,选择你的插件,点击下载即可。如下图:下载地址:https://chromewebstore.google.com/detail/video-downloader-cococut/ekhbcipncbkfpkaianbjbcbmfehjflpf 官方网址:https://cococut.net 免费…

具有低开关损耗的: FF100R12W1T7EB11 FF300R12ME7PB11 FF75R12W1T7EB11 FF800R12KE7PE IGBT模块,简单了解下它们的资料

FF800R12KE7PE是62 mm 1200 V, 800 A 低饱和压降的Fast trench IGBT半桥模块,采用TRENCHSTOP™ IGBT7和发射极控制第7代二极管。关于英飞凌IGBT模块:这些产品组合包括不同的先进IGBT功率模块产品系列,它们拥有不同的电路结构、芯片配置和电流电压等级,适用于几乎所有应用。…

程序员 SEO 系列:如何找到更多搜索关键词?

本文分享有效的关键词挖掘策略,帮助你识别低竞争、高流量的蓝海关键词,提升网站排名并带来持续流量增长。了解如何通过竞品分析、长尾词挖掘等方法,发掘适合你网站的关键词,快速提升 SEO 效果。 一、关键词研究(挖词)的目的? SEO 挖词的目的是通过深入 Research 和识别有…

agc032 A~E 题解

a 倒推,每次删掉最后一个b[i]=i的即可 b 一开始发现可以构造完全二分图,使两边和同为S,这样每个点的和=对面二分图点的和=S,然后n=6和为奇数 进一步发现可以直接分成A组组内和为B的组,然后组之间连边,此时S=(A-1)B,有AB=n(n+1)/2 当n为奇数时取A=(n+1)/2,B=n,n单独一组…

devc++配置opengl库

由于VisualStudio太占内存,所以用老古董devc++配图形学的环境。 用到的文件下载链接 Step1:建项目 首先打开dev 点文件--新建--项目--Multimedia--OpenGL c++/c都行(我这里用的c++) 名称最好用英文,然后确定,保存的地方也最好没有中文路径 Step2:添加库文件 找到DEV-C++的…