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

用Arduino和光敏电阻模块DIY一个智能小夜灯(附完整代码和接线图) 本文详细介绍了如何使用Arduino和光敏电阻模块DIY一个智能小夜灯,包括硬件选型、电路搭建、代码编写和安装调试的全过程。通过完整的代码和接线图,帮助读者快速实现一个能根据环境光线自动开关的智能照明方案,提升夜间活动的便利性和安全性。 阅读详情

“郭孟琦 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”


我承认这周课上完有一种崩溃的感觉,感觉难度陡然增加。仔细想想发现,其实难度来自于linux内核的结构庞杂。换一种思路,从大框上入手去分析新进程的创建过程效果会更好一些。


其次在调试过程中发现通过gdb确实可以验证程序的执行过程,但是仅凭gdb分析不是非常的清楚,因此我将精力放在了对源码的理解上。


在例子中是采用了fork系统调用来创建一个新进程。

从效果上看既执行了pid=0的部分,又执行了pid>0的部分。

显然fork返回了2次,对于父进程pid>0,子进程pid=0;


fork系统调用的系统函数是sys_clone,但本质上是执行了

do_fork

其中

p = copy_process(clone_flags, stack_start, stack_size,child_tidptr, NULL, trace);

就是将父进程的堆栈信息复制给子进程(也包含了为子进程在内存上申请空间作为子进程的堆栈)。

主要是通过这一句完成的

p = dup_task_struct(current);
而在copy_process接下来的部分是将父进程的 task_struct内容复制给子进程,其中包括了文件、内存、信号量、进程状态等信息的描述。(400多行的结构体也是开了眼了)链接:http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235


而我关注的主要部分是

retval = copy_thread(clone_flags, stack_start, stack_size, p);

在copy_thread中

p->thread.sp = (unsigned long) childregs;
调度后子进程堆栈的栈顶。

p->thread.ip = (unsigned long) ret_from_fork;
决定了子进程中调度后将从ret_from_fork处执行

childregs->ax = 0;
决定了子进程返回值(eax)为0;


这基本上就是课程所讲的内容,但是p和childregs的关系是什么?我对此探究了一下。

首先p是copy_thread的一个参数,这个p来自dup_task_struct()的返回值,同过回头对dup_task_struct()的分析发现p就是指向为子进程申请的task_struct。

而childeregs和p是在copy_thread()中通过

struct pt_regs *childregs = task_pt_regs(p);
#define task_pt_regs(t) (&(t)->thread.regs)
很显然childregs是p指向的PCB的一部分。

通过

*childregs = *current_pt_regs();
就实现了 将父进程堆栈的内容赋给了子进程。此时我认为子进程堆栈内容就是父进程调用SAVE_ALL后的堆栈内容。

那么子进程在调度后开始运行时就在

ret_from_fork;
处执行,进入
syscall_exit

就像执行完一次系统调用,在menu中子进程就会进入0那个部分然后屏幕输出。


总结:

Linux系统创建一个新进程的过程就是自我复制的一个过程。在启动内核的时候,start_kernel先产生1号进程(init)和2号进程(kthreadd),在1号进程中又fork出其他用户态进程,而start_kernel最终初始化完内核后变为0号进程(idle)。这三个进程是代码写出来的进程。其他的进程都是通过上面所写的“复制”“修改”“调度”这样产生出来的子进程。


这样创建新进程的方法在创建一个新进程时,父进程使用的内存并不是真正的全部复制给子进程。它们都指向同一处内存空间,但是把内存页面标记为copy-on-write。当任何一个进程试图向这些内存中写入内容时,就会产生一组新的内存页面由这个进程私有。这样,通过这种方法提高了创建新进程的效率,因为内存空间的复制推迟到了发生写操作的时候。


fork是用当前的进程来复制出一个新的进程,新进程与原进程一模一样,执行的代码也完全相同,但新进程有自己的数据空间、环境变量和文件描述符,我们通常根据fork函数的返回值来确定当前的进程是子进程还是父进程,返回一个pid_t的值用于判断,我们还可以继续执行fork后面的代码。

分析Linux内核创建一个新进程的过程(Linux) ------------分析Linux内核创建一个新进程的过程--------------        这次实验要详细分析Linux内核创建新进程的过程。那么我们应该先明确,一个进程在Linux内核中是怎样的。那么就是要知道如下的几个知识。        进程(Process)                系统进行资源分配和调度的基本单位,一个进程是一个程序的运行实例。 阅读详情

相关推荐

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

1、首先进入虚拟机,打开终端,这命令行依次敲入以下命令: cd LinuxKernel    rm menu -rf           //强制删除git clone https://github.com/mengning/menu.git    //将menu更新cd menu    mv test_fork.c test.c     //更新test.c make rootfs 

sinat_34144680的博客 1041

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

分析Linux内核创建一个新进程的过程 task_struct结构体分析 struct task_struct{ volatile long state; //进程的状态 unsigned long flags; //调用fork时候给出的进程号 long nice; //进程的基本时间片 unsigned long policy; //进程的调...

166

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

吕然 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

491

VS Code代码高亮配置与优化全指南

代码高亮是现代IDE的核心功能,通过色彩区分语法元素显著提升代码可读性。其原理是基于词法分析将不同语法单元映射到特定颜色标记,如关键字、字符串和注释等。在工程实践中,合理的代码高亮配置能提升40%以上的代码阅读速度,并帮助快速定位语法错误。VS Code作为主流编辑器,支持通过语言模式关联、主题配色方案和语义标记规则实现深度定制,特别适合处理Python类型提示、异步语法等复杂场景。针对大型项目,还可通过优化高亮性能设置和创建团队统一主题来提升开发效率。

weixin_30718391的博客 410

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

不管在什么系统中,所有的任务都是以进程为载体的,所以理解进程的创建对于理解操作系统的原理是非常重要的,本文是我在学习linux内核中所做的笔记,如有错误还请大家批评指正。注:我所阅读的内核版本是0.11。   一、关于PCB   对于一个进程来说,PCB好像是他的记账先生,当一个进程被创建时PCB被分配,然后有关进程的所有信息全都存储在PCB中,例如,打开的文件,页表基址寄存器,进程号等等。在linux中PCB是用结构task_struct来表示的,我们首先来看一下task_struct的组成。   代码位于linux/include/linux/Sched.h   struct ta

【Linux】实际项目应该如何完成?--安防监控系统项目的总结

到目前为止我也做个5、6个嵌入式项目,但以往都是从零开始自己做,也就是毫无计划,想到那里做那里,有想法就会去实现,就这样导致我碰到了很多坑,也消耗了我许多时间,当然,不是说这样不好,因为在其中我也得到了一个很好的锻炼与练习,但是这不适用于在工作中去这样做。...

修成真的博客 6725

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

张家骥 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029001.阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235 进程描述符(PCB)的数据结构就是task

标题获取失败 907

模型剪枝实战 | Torch-Pruning 库在YOLOv8上的应用指南

本文详细介绍了如何使用Torch-Pruning库对YOLOv8模型进行结构化剪枝,以实现模型“瘦身”。通过DepGraph(依赖图)技术自动处理层间依赖,确保剪枝安全。文章提供了从环境搭建、核心原理理解到完整剪枝流程的实战指南,并强调了剪枝后的微调与性能评估,帮助开发者在保持精度的同时显著提升模型推理速度。

weixin_29046035的博客 503

linux创建新进程的内核实现,Linux内核分析— —创建新进程的过程

分析Linux内核创建一个新进程的过程实验过程要求:使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone ,验证对Linux系统创建一个新进程的理解,推荐在实验楼Linux虚拟机环境下完成实验。cd LinuxKernelqemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S课程内容阅读理解t...

weixin_34526733的博客 542

查看电脑mac地址+主机名+用户名并导出

张三:李四,应公司要求,今天下班前必须将这张表格里面用户电脑的mac地址统计出来!李四:我该怎么办呢?一个一个查看,太没有效率了吧!对了,我可以做一个bat脚本啊!

拥抱着青春 1970

<硬件设计> 阻抗设计(二) 使用Si9000计算阻抗

阻抗设计(二) 使用Si9000计算阻抗

杰克拉力船长个人博客 1万+

第6节 分析Linux内核创建一个新进程的过程【Linux内核分析】

原创作品转载请注明出处 +《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000一、实验要求根据本周所学知识分析fork函数对应的系统调用处理过程二、实验内容 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sch

林沐风的技术学习专栏 686

ubuntu安装英伟达显卡驱动后wifi消失解决方法

ubuntu安装英伟达显卡驱动后(比如4090和3090等),会把wifi和蓝牙驱动去除,导致wifi无法连接。需要重新下载驱动安装。

人工智能(AI)技术,大模型技术,深度学习,机器学习,计算机视觉,AI工具实践应用等分享 3903

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

SA16225055冯金明    原创作品转载请注明出处  《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验内容: 实验要求: 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/li

Kimi_ming的博客 1158

2023-12-26~2025-07-04备份

一、海康视觉与汇川机器人 服务器-客户端通信设置IP在同一网段名称IP端口类型海康相机工控机7930服务器机器人3000客户端海康VM服务器设置1通信管理 增添TCP服务端,设置本机IP:192.168.0.20,端口号79302 协议解析 通信双方约定通信格式(设置收发数据格式,分隔符)机器人客户端设置(不同类型机器人设置有差别)1 通讯服务设置 设置连接服务器IP、服务端端口号、机器人端口号,确保连接正常2 协议解析 使用指令代码构建通讯解析。

青铜小码农 3126

FPGA数字下变频实战:用Vivado DDS IP核实现IQ采样与频率校正(附MATLAB仿真对比)

本文提供了一份基于Vivado DDS IP核实现FPGA数字下变频(DDC)的完整工程指南。详细阐述了IQ采样的原理、DDC链路构建、DDS频率校正的工程实现,并重点介绍了如何利用MATLAB搭建黄金参考模型进行全链路仿真与对比验证,分享了关键的调试技巧与性能优化建议。

t1u2v的博客 810
上一篇: 使用gdb跟踪分析一个系统调用内核函数
下一篇: Linux内核如何装载和启动一个可执行程序
oCoreCode
博客等级 码龄14年 1粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值