如果你想手写Linux系统

哈喽,我是子牙老师。今天咱们聊聊这个话题吧,Linux作为当今科技世界的地基,我们越来越接近真理了,有木有?

这个文章的角度,你可能全网都很难找到第二篇如此系统讲透这个问题的文章

你可能想问:你之前不是写过操作系统吗,怎么又写一个Linux系统?
在这里插入图片描述

我之前写的,或者说做的课程,或者你们从这个网站上下载的,都是操作系统内核
在这里插入图片描述

操作系统内核,是一套管理硬件的程序,用户是用不了的。但是内核给开发用户态程序提供了丰富的API。基于Linux内核的API,开发出了Linux系统,即用户可以使用的用户态。其中包括:ubuntu、centos、redhat、Android、鸿蒙……Linux内核牛不牛逼?

基于Linux内核提供的API,基于Linux操作系统,又诞生了今天科技世界的基础设施:AI层、redis、MySQL、nginx、docker…还有很多很多关键基础设施,比如kvm……
在这里插入图片描述

我之前说Linux是当今科技世界的地基,有人说我乱说,真是无知者无畏。我后来想明白了,所处高度不同,眼前看到的风景自然不同,何必与夏虫语冰

写一个操作系统内核,是你学习计算机专业课《操作系统导论》《计算机组成原理》《数据结构》……或者说计算机学科所有专业课,最顶级的方式!而且生动有趣形象,那些看不见摸不着的理论,你在写的过程中,都变得具象化了:页表、内存映射、缺页异常、写时复制、进程切换、线程调度、线程上下文、中断触发……

那怎么开发一个用户态的Linux系统呢?以下,enjoy

缘起

看到这种图后,我的大脑开始抛出无数的问题
在这里插入图片描述

我后面理清了思绪,大概有这些问题:

  1. 用户态能看到的顶层进程是1号进程,那有没有0号进程呢?
  2. 0号进程在Linux内核的设计中承担了什么样的角色?
  3. 我记得最开始玩Linux的时候,用户态的顶层进程是init,与当前systemd之间什么关系?
  4. 用户态的顶层进程systemd,在内核态长啥样
  5. 自己开发的Linux系统,是如何与Linux内核关联起来的,比如busybox
  6. Linux内核是如何进入用户态的
  7. Linux内核是如何基于一个可执行文件起一个进程的
    ……

如果你恰好也有这些问题,受实力所限,无法得到答案,那太好了。BTW,技术还行哦,对Linux的理解能到这个程度

瓦特?你都不知道我在说什么?那你现在的水平,在AI时代,是非常危险的!赶紧去提升实力吧!ChatGPT能帮你写代码?ChatGPT能帮任何使用他的人写代码,你跟别人的区别在哪呢?或者说,谁能更好的使用AI呢?是那些对行业理解得更广更深的人,对吧

同样使用ChatGPT,你觉得你跟我,谁能最大化发挥ChatGPT的价值?

Linux始祖进程

看《玫瑰的故事》,黄亦玫的女儿名字叫太初,我觉得蛮好听的。太初其实就是始祖的意思,只不过含蓄一些。你们觉得,黄亦玫希望她的女儿是谁的始祖呢?我觉得应该是自己的始祖吧,永远做自己,不被世俗污染与束缚,满满的大爱

《道德经》中说“道生一,一生二,二生三,三生万象”。在道家的角度,零即为道。我猜Linux内核如果是中国人写的,它的进程结构应该是这样的
在这里插入图片描述

那Linux内核的始祖进程是谁呢?init_task,即0号进程。这个进程不像其他进程,是通过函数__do_fork创建出来的,这个进程是内核开发工程师编织出来的,如图
在这里插入图片描述

你是不是想问:为什么是编织,而不是通过程序创建?那你是否想过,今天的科技世界的源头,一定有一个编译器,是用二进制写出来的。一样的道理,总得有鸡才有蛋。你是不是想问,没有蛋哪来的鸡?鸡可以造出来,或者由其他物种变异而来,蛋就真的没办法

CPU何时切入0号进程执行的呢?这个有点特别,CPU不会切入0号进程,内核开发工程师会将0号进程与BSP核(CPU启动核)进行绑定。这个操作是在Linux内核的很早期完成的,在创建1号进程、启用所有AP核之前,在这两个阶段之前,很关键。代码没找着,自己写代码测的,Linux内核是这么干的
在这里插入图片描述

关于0号进程,还有一个关键点就是,当BSP核执行完所有初始化动作,0号进程就进化为idle进程,就是当CPU没事干的时候执行的进程,对应的代码:CPU进入低功耗,响应中断唤醒
在这里插入图片描述

更特别的是,进化为idle进程的0号进程可以被多个CPU核同时运行!

Linux1号进程

1号进程就好理解很多了。但是如果你想搞明白它与用户态,与一个可执行文件是如何关联上的,牵扯的东西就比较多了。但是于我而言,没啥难度,毕竟对于Linux,我已经建立了较为完整的认知

先看1号进程的创建,0号进程创建了两个内核线程:kernel_init(1号)、kthread(2号)
在这里插入图片描述

kernel_init内核线程就是1号进程systemd的内核态,kernel_init是如何进入用户态的呢?三个途径
在这里插入图片描述
在这里插入图片描述

接下来从源码层面讲解内核线程kernel_init进入用户态细节,其实就是函数run_init_process
在这里插入图片描述

函数run_init_process的调用链,我已经画好了图。

进入用户态

从上一段观点可知,Linux内核进入用户态,默认会去找init程序,先说对init的处理吧

run_init_process调用链中,会进入一个非常核心的函数:load_elf_binary,这个函数就是完成了进程的创建,内存空间长这样。其实就是将硬盘上的init程序,按照进程内存空间布局规范,实现程序内存化,又称进程态
在这里插入图片描述

看代码区吧,这是kernel_init内核线程进入用户态要执行的地方。理论上每个进程的代码区都是从0x40000开始的,但是实际中略有偏差,我们看init程序的代码入口点:0x400890,记住这个位置,后面会讲到
在这里插入图片描述

这时候进程就创建完了,等待调度。还有一点讲下,所有进程的入口函数都不是可执行文件中的那个,而是ret_from_fork,在这设置的
在这里插入图片描述

这个函数非常非常非常关键,就是所有进程由内核态进入用户态的那座桥!关于内核第一次由内核态切用户态,这个不懂汇编、中断的小伙伴可能看不懂了。这里是模拟中断跨态切换实现的。我就不展开讲了,直接看代码跟内存吧。当init进程获得调度,会进入函数ret_from_fork
在这里插入图片描述

在这个函数的执行过程中,我们找到init程序的入口点0x400890就找到答案了
在这里插入图片描述

至此,秘密全部揭开!太畅快了!

对了,还有init与systemd,它们都是内核线程kernel_init进入用户态的存在形式。早期是init,现在是systemd

如果你看懂了这篇文章,你就知道如何写一个Linux系统。

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

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

相关文章

LabVIEW电滞回线测试系统

铁电材料的性能评估依赖于电滞回线的测量,这直接关系到材料的应用效果和寿命。传统的电滞回线测量方法操作复杂且设备成本高。开发了一种基于LabVIEW的电滞回线测试系统,解决传统方法的不足,降低成本,提高操作便捷性和数据分析的自…

spring boot 3.x版本中集成spring security 6.x版本进行实现动态权限控制解决方案

一、背景 最近在进行项目从jdk8和spring boot 2.7.x版本技术架构向jdk17和spring boot 3.3.x版本的代码迁移,在迁移过程中,发现spring boot 3.3.x版本依赖的spring security版本已经升级6.x版本了,语法上和spring security 5.x版本有很多地方…

Mysql中存储引擎简介、修改、查询、选择

场景 数据库存储引擎 数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS )使用数据引擎进行创建、查询、更新和删除数据的操作。 不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以…

【C++报错已解决】Invalid Use of ‘this’ Pointer

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 引言 一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:修正‘this’指针使用2…

React+TS前台项目实战(二十六)-- 高性能可配置Echarts图表组件封装

文章目录 前言CommonChart组件1. 功能分析2. 代码详细注释3. 使用到的全局hook代码4. 使用方式5. 效果展示 总结 前言 Echarts图表在项目中经常用到,然而,重复编写初始化,更新,以及清除实例等动作对于开发人员来说是一种浪费时间…

LVS-DR负载均衡

LVS-DR负载均衡 LVS—DR工作模式 原理 客户端访问调度器的VIP地址,在路由器上应该设置VIP跟调度器的一对一的映射关系,调度器根据调度算法将该请求“调度“到后端真实服务器,真实服务器处理完毕后直接将处理后的应答报文发送给路由器&#xf…

EDI安全:如何在2024年保护您的数据免受安全和隐私威胁

电子数据交换(EDI)支持使用标准化格式在组织之间自动交换业务文档。这种数字化转型彻底改变了业务通信,消除了对纸质交易的需求并加速了交易。然而,随着越来越依赖 EDI 来传输发票、采购订单和发货通知等敏感数据,EDI …

【跨境分享】中国商家如何卷到国外?电商独立站和电商平台的优势对比

为什么要选择独立站而不是电商平台 对于跨境电商经营者而言,采取多平台、多站点的运营策略是至关重要的战略布局。这一做法不仅有助于分散风险,避免将所有投资集中于单一市场,从而降低“所有鸡蛋置于同一篮子”的隐患,而且有利于拓…

【友邦保险-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

华为od相关信息分享

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C合集) 问 1.什么是华为od? 答:OD全称是Outsourcing Dispacth,即外包派遣,是华为和外企德科…

Kafka日志处理:深入了解偏移量查找与切分文件

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello, 大家好!我是你们的技术小伙伴小米,今天要和大家分享一些关于Kafka日志处理的深入知识。我们将讨论如何查看偏移量为23的消息,以及Kafka日志分…

重载、覆盖(重写)、重定义(同名隐藏)的区别 (超详解)

📚 重载(Overloading)、覆盖(Overriding)、重定义(Hiding)是面向对象编程中常见的概念,它们分别用于描述不同情况下函数或方法的行为。 目录 重载(Overloading&#xff…

ST7789 linux4.x驱动

文章目录 ST7789 linux4.x驱动设备树配置驱动程序编译驱动测试驱动 ST7789 linux4.x驱动 设备树配置 pinctrl_ecspi2_cs_1: ecspi2_cs_grp-1 {fsl,pins <MX6UL_PAD_CSI_DATA01__GPIO4_IO22 0x40017059>; };pinctrl_ecspi2_1: escpi2grp {fsl,pins <MX6UL_PAD_CSI_…

RocketMQ快速入门:主从、集群模式原理及搭建实操(十一)

目录 0. 引言1. 前备知识1.1 namesrv集群模式1.2 broker集群模式1.2 broker主从复制原理 2. 集群部署2.1 环境准备2.2 配置讲解2.3 一主多从模式部署2.4 多主无从模式部署2.5 多主多从模式部署 3. 总结 0. 引言 在学习完rocketmq的基础知识后&#xff0c;我们进入rocketmq高可…

和Bug较劲的第n天:[Error: Unable to open snapshot file: No such file or directory]

问题描述 最近做了一个小demo&#xff0c;基于parcel的&#xff0c;在迁移仓库的时候发生了一个报错 [Error: Unable to open snapshot file: No such file or directory] 原因分析&#xff1a; 在迁移仓库的时候&#xff0c;我将项目放入了一个以中文命名的文件夹里&#xf…

模电基础 - 信号的运算和处理

目录 一. 简介 二. 加法 三. 减法 四. 乘法 五. 除法 六. 总结 一. 简介 在模电基础中&#xff0c;信号的运算和处理是非常重要的内容。 信号的运算包括加法、减法、乘法、除法等。通过使用集成运放&#xff0c;可以很容易地实现这些运算。例如&#xff0c;利用反相输入…

算法的几种常见形式

算法&#xff08;Algorithm&#xff09; 算法&#xff08;Algorithm&#xff09;是指解决问题或完成任务的一系列明确的步骤或规则。在计算机科学中&#xff0c;算法是程序的核心部分&#xff0c;它定义了如何执行特定的任务或解决特定的问题。算法可以用多种方式来表示和实现…

宜春旅游集散中心展厅OLED透明屏方案设计

一、项目概述 为提升宜春旅游集散中心展厅的现代化展示水平&#xff0c;增强游客的参观体验&#xff0c;我们计划在展厅的核心区域引入OLED透明屏技术。该方案旨在通过高科技的视觉呈现方式&#xff0c;将展品信息以虚拟与现实相结合的方式展现&#xff0c;打造出一个既具科技感…

谷粒商城学习笔记-22-分布式组件-SpringCloud-OpenFeign测试远程调用

文章目录 一&#xff0c;OpenFeign的简介二&#xff0c;OpenFeign的使用步骤1&#xff0c;场景说明2&#xff0c;引入依赖2&#xff0c;开启OpenFeign3&#xff0c;编写Feign接口4&#xff0c;使用feign调用远程接口5&#xff0c;验证 错误记录 上一节学习了注册中心&#xff0…

鼠标录制工具|键鼠轨迹录制,实现自动办公

利用键鼠录制工具录制固定的鼠标点击、键盘输入等操作&#xff0c;实现自动化执行固定操作&#xff0c;节省时间。鼠标录制功能可以录制多步骤的操作&#xff0c;将录制的动作保存并命名&#xff0c;甚至可以编辑操作速度。下面将演示几种生活中常见的案例&#xff0c;详细讲解…