首页 > 系统相关 >linux内核初始化阶段-fork内嵌问题

linux内核初始化阶段-fork内嵌问题

时间:2024-05-24 22:07:42浏览次数:25  
标签:fork 内嵌 调用 int syscall0 linux 进程 内核

目录

1.在linux内核初始化程序中fork需要_syscall0(int,fork) 的背景

1.1.背景

  • 内核的main中线进行了所有硬件初始化工作,包括陷阱门、块设备、字符设备和tty,包括人工设置第一个任务(task 0)。待所有初始化工作完成后就设置中断允许标志以开启中断,main()也切换到了任务0中运行。
  • 在整个内核完成初始化后,内核将执行权切换到了用户模式(任务0),也即CPU 从0 特权级切换到了第3 特权级。此时main.c 的主程序就工作在任务0 中。然后系统第一次调用进程创建函数fork(),创建出一个用于运行init()的子进程。
    image
  • 此后程序把自己“手工”移动到任务0(进程0)中运行,并使用fork()调用首次创建出进程1(init 进程)。在init 进程中程序将继续进行应用环境的初始化并执行shell 登录程序。而原进程0 则会在系统空闲时被调度执行,此时任务0 仅执行pause()系统调用,并又会调用调度函数。
  • 在 init 进程中,如果终端环境建立成功,则会再生成一个子进程(进程2),用于运行shell 程序/bin/sh。若该子进程退出,则父进程进入一个死循环内,继续生成子进程,并在此子进程中再次执行shell 程序/bin/sh,而父进程则继续等待。

1.2.重点来了-为啥需要_syscall0(int,fork)

  • 由于创建新进程的过程是通过完全复制父进程代码段和数据段的方式实现的,因此在首次使用fork()创建新进程init 时,为了确保新进程用户态堆栈没有进程0 的多余信息,要求进程0 在创建首个新进程之前不要使用用户态堆栈,也即要求任务0 不要调用函数。因此在main.c 主程序移动到任务0 执行后,任务0 中的代码fork()不能以函数形式进行调用。程序中实现的方法是采用gcc 函数内嵌的形式来执行这个系统调用
static inline _syscall0(int,fork)
// 这是unistd.h 中的内嵌宏代码。以嵌入汇编的形式调用Linux 的系统调用中断0x80。该中断是所有
// 系统调用的入口。该条语句实际上是int fork()创建进程系统调用。
// syscall0 名称中最后的0 表示无参数,1 表示1 个参数。参见include/unistd.h,133 行

image

2.内联函数 + 宏定义的作用

  • 在编译链接前会对源文件进行预处理,它会将源文件中的头文件以及宏(在这里就是把用#define定义的_syscall宏展开)都展开。
  • gcc会把上述“函数”体中的语句直接插入到调用fork()语句的代码处,因此执行fork()不会引起函数调用

3.参考

《Linux内核完全注释》
写时复制(COW)详解
[fork()与_syscall0(int,fork) 关系](fork()与_syscall0(int,fork) 关系)
main.c中关于pause和fork的内嵌问题
Linux内核堆栈使用方法 进程0和进程1

标签:fork,内嵌,调用,int,syscall0,linux,进程,内核
From: https://www.cnblogs.com/kongweisi/p/18211723

相关文章

  • 手把手教你编译属于自己的内核--->WSL-Linux子系统编译安装内核教程
    准备步骤前言:文章操作wsl子系统为ubuntu1.到LINUX内核官网下载最新版的内核Linux内核官网:Linux内核官网点击黄色按钮即可下载最新版本内核解压tarxvJflinux-6.9.1.tar.xz2.使用gitclone到github下载WSL2内核源码到终端输入​sudogitclone https://github.com/......
  • Linux Xorg与Vsync不兼容,使用独显启动,在外置显示器上有时会卡死
    https://www.vsynctester.com/https://forums.developer.nvidia.com/t/bug-having-two-monitor-connected-x11-causes-initial-stutter-when-opening-steam/278749https://www.reddit.com/r/linux_gaming/comments/tdt1gx/looking_for_people_having_stutter_issues_with/h......
  • Linux应用——进程基础
    谁来调用main函数在运行main函数之前,会有一段引导代码,最终由这段代码调用main函数,这段引导代码不需要自己编写,而是在编译、链接中由链接器将这段程序链接到应用程序中,构成最终的可执行文件,加载器会将可执行文件加载到内存中进程的终止正常终止在main函数中通过retur......
  • [Linux] 进程概念
    目录1.冯诺依曼硬件体系结构2.操作系统(OS)3.系统接口4.进程的概念5.进程状态6.四个其他概念7.环境变量8.进程地址空间1.冯诺依曼硬件体系结构在冯诺依曼体系结构中,计算机是由输入、输出、存储设备和中央处理器cpu组成的。图中体结构的存储器专指内存,内存......
  • Linux网络服务
    1.http协议版本 2.http请求请求头HTTP:用户的请求与响应被后格式与定义HTTP请求豹纹 请求起始行:GET/(uri)HTTP/1.1 请求头(head):User-Agent:客户端代理(浏览器)Host:域名空行请求豹纹主体(body):POSTHTTP响应报文响应报文的起始行:......
  • 【Linux学习】进程间通信 (1) —— 管道
    下面是有关进程通信中管道的相关介绍,希望对你有所帮助!小海编程心语录-CSDN博客1.进程通信的基本概念1.1概念进程间通信简称IPC ,指两个进程之间的通信。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和......
  • Linux-Nginx安装及启动命令
    目录1、安装依赖2、nginx安装3、防火墙打开80端口4、nginx启动停止1、安装依赖yum-yinstallgcc-c++ yum-yinstallpcrepcre-devel yum-yinstallzlibzlib-devel yum-yinstallopensslopenssl—devel2、nginx安装mkdir/usr/local/src/nginxcd......
  • Windows下分卷压缩后到Linux进行解压的方法
    windows分卷压缩后linux解压缩 Linux服务器在内网,中途隔了一层堡垒机。文件太大,堡垒机对此有限制,需要在Windows上分包,然后上送到Linux上进行合并解压。我探索出来的办法有两个,以下依次介绍:1、WinRAR+7za命令WinRAR上需要选择压缩格式为zip,输入分卷大小: 然后将分卷都传......
  • Linux系统中如何查看磁盘情况
    Linux不像windows系统那样方便的图形界面,特别是作为服务器使用的时候,只有命令行可以使用。我有个云服务器平时用来做一些数据分享用的,最近想看看磁盘和其中文件的占用情况,于是搜索并学习了一些查看磁盘空间信息的命令,命令虽然简单,但对我自己来说还是有些新的东西值得记录。1.df......
  • orangepi zero2在linux5.4以上内核使用ili9341
    背景根据orangepizero2用户手册说明,linux5.13内核不能使用modprobefbtft_device驱动spilcd查看linux内核源码提交记录,发现在v5.4-rc3中删除了fbtft_device.c文件commit如下staging/fbtft:Removefbtft_deviceCommitc440eee("Staging:fbtft:Switchtothegpiode......