2023-2024-1 20232826《Linux内核原理与分析》第七周作业

20232826王朝昆 2023-11-03 23:35:25

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

 

1. 《庖丁解牛Linux分析》第七章AI问答 

          

       

 

2. 阅读理解 task_struct 数据结构

“task_struct” 是 Linux 内核中的一个非常重要的数据结构,用于表示每个正在运行的进程或线程。每个进程或线程都有一个关联的 `task_struct` 结构,其中包含了有关该进程或线程的各种信息,用于管理和跟踪其状态、资源、进程上下文以及与其他进程之间的关系。

“task_struct” 结构包括大量字段,其中一些重要的字段包括:

1. 进程标识符(PID):“task_struct” 中包含了一个字段,用于存储进程的唯一标识符,即 PID。PID 是用于唯一标识每个进程的整数值。

2. 状态信息:`task_struct` 存储了进程的状态信息,如运行中、等待中、停止等,以便内核了解进程的当前状态。

3. 调度信息:进程的调度信息,如调度类别、优先级、时间片等,用于操作系统的进程调度器来管理进程的执行。

4. 资源管理信息:包括进程的资源限制、打开文件描述符、信号处理程序、内存映射、进程锁定信息等,用于控制和管理进程所需的资源。

5. 进程上下文信息:保存了进程的寄存器状态、堆栈指针、指令指针等,以便操作系统能够在进程切换时保存和还原进程的执行上下文。

6. 进程的父子关系:`task_struct` 存储了与其他进程的父子关系,以便构建进程树和进行进程间通信。

7. 进程信号信息:包括挂起的信号、挂起的信号处理程序等,用于处理进程接收到的信号。

8. 进程优先级和调度信息:包括进程的调度优先级,以便操作系统的调度器确定进程的执行顺序。

“task_struct” 在内核中的使用非常广泛,它是 Linux 内核中进程管理的核心数据结构。当操作系统创建新的进程、进行进程切换、执行系统调用、管理资源分配等任务时,`task_struct` 中的信息起着关键作用。因此,“task_struct” 是 Linux 内核中的一个重要数据结构,用于维护和管理操作系统中的所有进程和线程的状态和信息。

 

3. 分析fork函数对应的内核处理过程 sys_clone

 

“fork()” 函数是一个用于创建新进程的系统调用,它会创建一个新的进程,该进程是调用进程的副本,继承了调用进程的大部分属性和状态。在 Linux 内核中,“fork()” 函数的实现实际上是基于 “sys_clone” 系统调用的,而 “sys_clone” 是在内核中完成新进程的创建的关键部分。

下面是 “fork()” 函数对应的内核处理过程,以及新进程是如何创建和修改 “task_struct” 数据结构的:

1. 当应用程序调用 “fork()” 函数时,它会触发相应的系统调用,即 “sys_fork”。

2. 在 “sys_fork” 中,内核首先为新的进程分配一个新的 “task_struct” 数据结构,即新的进程控制块(PCB)。

3. 内核会将父进程的 “task_struct” 数据结构复制到新分配的 “task_struct” 中,以便新进程继承父进程的大部分属性和状态。这包括进程标识符(PID)、资源限制、打开文件描述符、信号处理程序等等。

4. 新进程的状态被设置为就绪状态,以便在适当的时间点被内核调度执行。

5. 新进程的系统调用返回给父进程,而新进程的 PID 返回给父进程。父子进程之间现在拥有相同的内存映射,但这些映射是写时复制(Copy-On-Write,COW)的,因此它们共享物理内存,直到其中一个进程尝试对共享内存进行写操作,此时内核会为写操作的进程创建一个独立的物理内存副本。

“fork()” 函数在 Linux 内核中的处理过程包括创建一个新的 “task_struct” 数据结构,复制父进程的大部分属性和状态,设置新进程的状态为就绪,并返回新进程的 PID 给父进程。父子进程之间在内核中共享一些资源,直到其中一个进程尝试修改共享资源,此时内核会为修改操作的进程创建新的资源拷贝,以实现写时复制(COW)的行为。这使得新进程的创建非常高效,因为只有在需要时才会真正复制资源。

 

 

4. 使用 gdb 跟踪分析一个 fork 系统调用内核处理函数 sys_clone

   4.1 启动MenuOS

cd LinuxKernel

rm -rf menu

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

//如果git失败,解除ssl验证后,再次git即可,git config --global http.sslVerify "false"

cd menu

make rootfs

                  

                  

输入help命令后,执行fork,从图中可以看到fork函数创建了父进程与子进程。

 4.2 使用gdb跟踪fork内核处理函数 sys_clone

通过增加-s -S启动参数打开调试模式;
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

             

gdb vmlinux


// 打开gdb进行远程调试。

              

 设置断点:

b sys_clone

b do_fork

b dup_task_struct

b copy_process

b copy_thread

b ret_from_fork

             

 执行fork命令,停在了断点sys_clone处,按c继续执行,可以看到sys_clone的执行过程:

           

 总结:

在内核中创建一个新进程的过程通常涉及多个函数和步骤,这些步骤可能会因操作系统的不同而有所变化,但通常会包括以下一般步骤:

1. 分配进程描述符:操作系统需要为新进程分配一个唯一的标识符,通常是一个进程描述符,用来存储有关该进程的信息。这通常涉及到分配内存和设置进程的状态信息。

2. 分配内存空间:为新进程分配一块内存空间,用来存储进程的代码、数据、堆栈等信息。这个步骤可能包括分配虚拟内存、物理内存的页面分配等。

3. 复制父进程的上下文:通常,新进程会继承一些父进程的属性,如文件描述符、环境变量等。这需要复制父进程的上下文信息。

4. 加载可执行文件:新进程通常需要加载一个可执行文件,这包括解析可执行文件的头部、分配内存、复制代码段和数据段到进程的内存空间等。

5. 初始化寄存器和堆栈:设置新进程的寄存器和堆栈,以便执行新进程的代码。这通常包括设置程序计数器(PC)以指向新进程的入口点,并设置堆栈指针(SP)。

6. 设置进程状态:将新进程的状态设置为就绪状态,以便调度程序可以在合适的时机运行它。

7. 将新进程添加到进程调度队列:操作系统通常会有一个进程调度队列,新进程将会被加入队列等待调度。

8. 调度新进程:调度程序会选择一个就绪状态的新进程来运行,将其上下文切换到CPU上。

9. 执行用户程序:新进程的代码开始在CPU上执行。

在Linux内核中,创建新进程通常涉及到函数调用,如`fork()`(创建子进程)、`exec()`(加载可执行文件)、`clone()`(创建轻量级进程)、`do_fork()`(创建新进程)等。这些函数会涉及到上述步骤的实现。具体的函数和步骤可能因操作系统的不同而有所不同,但上述步骤是一般的创建新进程的基本过程。

 

 

...全文
361 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文系统介绍了C语言在底层系统编程与数据结构工程化实现中的核心技术,同时融合了现代Web开发中TypeScript类型系统与全栈项目架构设计。C语言部分聚焦操作系统接口调用、内存管理、文件操作与进程控制,深入讲解指针、动态内存分配、结构体与位运算,并通过实现简易shell、日志系统等工具强化实践能力;数据结构部分涵盖链表、栈、队列、哈希表、二叉树与图结构的C语言实现,结合时间与空间复杂度分析,应用于缓存系统、路径搜索等实际场景,并引入内存池优化频繁分配问题。TypeScript部分强调静态类型在提升代码可靠性中的作用,讲解基础类型、泛型、交叉与联合类型、条件类型等,并通过DTO与接口类型保障前后端数据一致性。全栈项目基于React/Vue + Node.js架构,实现RESTful API、JWT认证、统一响应结构,并结合ORM进行数据库操作,完成用户系统、权限管理与任务管理系统等实战项目。同时强调工程化建设,包括代码规范、单元测试、CI/CD及Docker容器化部署。; 适合人群:具备C语言和JavaScript基础,有一定编程经验,希望深入系统编程或向全栈工程师发展的1-3年开发者;; 使用场景及目标:①掌握C语言在系统级开发中的核心应用,如内存管理与系统调用;②实现常用数据结构并应用于工程场景;③构建类型安全的全栈项目,提升前后端协同开发效率;④建立完整的软件工程化能力体系; 阅读建议:学习过程中应结合代码实践,动手实现各类数据结构与系统工具,同步搭建全栈项目,配置工程化工具链,注重理论与实际项目的深度融合。
内容概要:本文介绍了脚本自动化运维在芯片行业中应用于EDA工具链的实战项目,重点解决工具配置、许可证管理与仿真任务调度等效率瓶颈问题。通过构建Bash与Python混合的自动化脚本系统,实现License动态调度、仿真任务并行化、断点续跑及版本兼容性处理,显著提升资源利用率与设计效率。典型案例如License调度脚本通过监控进程活跃度回收闲置许可,结合Flask API实现服务化查询与CI/CD集成,使工程师等待时间从4小时降至15分钟,License利用率提升至89%,并在7nm GPU项目中节约千万级成本。文章还展望了多云调度、AI预测与开源EDA适配等未来方向。; 适合人群:芯片设计工程师、EDA工具运维人员、自动化脚本开发者,以及具备Python/Bash基础的半导体行业技术人员;; 使用场景及目标:①优化高成本EDA许可证的分配与回收,提升资源利用率;②实现大规模仿真任务的自动编排与容错执行;③将自动化脚本嵌入CI/CD流程,支撑高频次验证与签核需求;④降低流片期与研发成本,加速国产芯片研发进程; 阅读建议:此资源强调工程实践与系统思维的结合,建议读者在掌握基本脚本语法基础上,重点关注异常处理、权限控制、日志审计等生产级设计细节,并尝试将其方案迁移至实际EDA流程中进行调试与优化。
内容概要:本文档整合《六韬》兵法智慧,构建了一套适用于现代团队管理的“五维战力提升模型”,涵盖骨干识别激励(武锋)、战术灵活运用(林战)、团队凝聚力训练(分合)、人才选拔标准(选练)与培训落地体系(教战)五大模块。通过35天系统化实战路径、15个实用工具模板、五维诊断评估及身体锚点仪式,帮助管理者诊断团队短板,逐步建立科学化、可复制的团队战力建设体系,解决骨干流失、培训失效、战术僵化等常见管理难题,并辅以韩信点兵、赵括纸上谈兵等历史案例增强理解。; 适合人群:具备一定团队管理经验,面临骨干识别难、培训落地难、团队协同弱等问题的基层及中层管理者,尤其适合10人以上团队负责人;小团队也可根据实际情况简化使用。; 使用场景及目标:①用于系统诊断并改善团队在激励、分工、选拔、培训等方面的薄弱环节;②指导管理者按照35天路径逐步实施变革,实现团队战力的整体跃升;③结合历史案例与工具模板,提升管理决策的深度与执行力。; 阅读建议:建议用户先完成五维诊断,锁定最需改进的1-2个维度优先突破,不必强求一次性执行全部模块;所有工具均可直接套用,配合每日实操动作与身体锚点仪式强化执行惯性,同时可联动其他管理资源包(如立将威信术、决策领导力三合包)形成完整管理体系。

39

社区成员

发帖
与我相关
我的任务
社区描述
北京电子科技学院 《Linux内核原理与分析》课程
linuxarm开发系统安全 高校 北京·丰台区
社区管理员
  • rocflytosky
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧