首页 > 系统相关 >分析 Linux 内核创建一个新进程的过程

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

时间:2024-11-09 18:20:11浏览次数:3  
标签:fork 调用 创建 clone 内核 Linux 进程

张晓攀+原创作品转载请注明出处+《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()调用,父进程可能会等待子进程执行完成后才继续运行。

标签:fork,调用,创建,clone,内核,Linux,进程
From: https://www.cnblogs.com/20202215zxp/p/18537087

相关文章

  • 函数的栈帧空间创建与销毁全过程(详解~)
    目录一.什么是函数栈帧?二.理解函数栈帧的创建能解决哪些问题?三.创建函数栈帧空间的之前认知3.1什么是栈3.2认识相关寄存器3.3汇编指令四.创建和销毁全过程4.1预备知识4.1.1调用堆栈4.2打开反汇编4.3函数栈帧创建​编辑4.4函数栈帧销毁一.什么是函数栈......
  • linux下文件与inode的关系
    最近忽然被问到一个问题:程序A打开了文件a.txt,程序B覆盖了a.txt,那这时候程序A读取到的内容是怎么样的?是读取到旧内容,还是新内容,或者是半新半旧?为了解答这个问题,得先明白系统的文件管理机制。以Linux为例,文件属于一种资源,它是由系统内核统一管理的。操作文件也只能是通过内核的系统......
  • rocky linux 重启网卡命令
    通用的命令 ifdown ens33关闭网卡名叫ens33的网卡ifup ens33  开启网卡名叫ens33的网卡查看IP地址ip aCentos8和RockyLinux 管理网卡新命令 nmcli connection和c都可以 1、重载网卡,重启网卡之前一定要重新载入一下配置文件,不然不能......
  • 如何在 Linux 中按名称终止进程?
    在Linux系统中,进程是指正在执行的程序或任务的实例。每个程序在运行时会创建一个或多个进程,并且这些进程在后台或前台执行。虽然大部分进程是正常运行的,但有时候系统中可能会出现一些故障进程,这些进程可能会导致系统资源浪费或系统变得缓慢。在这种情况下,终止这些不正常的......
  • 2024 年 10 个最佳 Linux 服务器发行版
    对于系统管理员和网络工程师来说,选择正确的Linux发行版尤为关键,因为它直接影响到服务器的性能、维护成本及长期使用的稳定性。虽然Linux系统有上百种发行版,但不同的发行版在功能、社区支持、企业级支持等方面有所不同。因此,了解并选择一个适合自己需求的Linux发行版显......
  • 线程池创建方式
    线程池创建方式  一、方式一:通过ThreadPoolExecutor构造函数来创建(推荐)  方式二:通过Executor框架的工具类Executors来创建。  Executors工具类提供的创建线程池的方法如下图所示:  可以看出,通过Executors工具类可以创建多种类型的线程池,包括:  1. Fixed......
  • linux搭建大数据环境
    前期准备工作友情提醒提前安装好vmware软件,准备好连接虚拟机的客户端一.基础环境1.配置ip地址修改ip配置文件[root@node1/]#vim/etc/sysconfig/network-scripts/ifcfg-ens33TYPE="Ethernet"PROXY_METHOD="none"BROWSER_ONLY="no"#1.把dhcp修改成staticBOOTP......
  • StarUML建模工具安装学习与汉化最新零基础详细教程【一键式下载】(适用于Windows、MacO
    StarUML破解安装下载教程前言:StarUML破解与汉化安装下载教程,仅供学习研究和交流使用,禁止作为商业用途或其他非法用途!仓库作者:X1a0He,经仓库作者授权使用。目录StarUML破解安装下载教程1.下载准备1.1一键式准备【懒人准备】1.2学习式准备1.2.1学习准备2.window......
  • 使用HTML、CSS和JavaScript创建动态雪人和雪花效果
    ✅作者简介:2022年博客新星第八。热爱国学的Java后端开发者,修心和技术同步精进。......
  • 在 Linux 上部署 Redis 通常有两种常见的方法
    在Linux上部署Redis通常有两种常见的方法:一种是通过包管理工具(如apt或yum)直接安装,另一种是通过源码编译安装。下面将分别介绍这两种方法。1.使用包管理工具安装Redis1.1.在Ubuntu/Debian上安装Redis更新包索引:sudoaptupdate安装Redis:sudoaptinsta......