如果你想手写Linux系统

news2024/11/16 4:18:07

哈喽,我是子牙老师。今天咱们聊聊这个话题吧,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.coloradmin.cn/o/1909380.html

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

相关文章

论文辅导 | 基于模态分解的Transformer-GRU联合电池健康状态估计

辅导文章 模型描述 提出一种基于变分模态分解(variational mode decomposition,VMD)与粒子群优化(particle swarm optimization,PSO)的变换神经网络(Transformer)和门控循环单元(gate recurrent unit,GRU)的联合方法。首先将锂电池容量信息通…

科普文:一文搞懂jvm实战(四)深入理解逃逸分析Escape Analysis

概叙 Java 中的对象是否都分配在堆内存中? 好了太抽象了,那具体一点,看看下面这个对象是在哪里分配内存? public void test() { Object object new Object(); }这个方法中的object对象,是在堆中分配内存么&#xff1…

城市地下综合管廊物联网远程监控

城市地下综合管廊物联网远程监控 城市地下综合管廊,作为现代都市基础设施的重要组成部分,其物联网远程监控系统的构建是实现智慧城市建设的关键环节。这一系统集成了先进的信息技术、传感器技术、通信技术和数据处理技术,旨在对埋设于地下的…

免费无限白嫖阿里云服务器

今天,我来分享一个免费且无限使用阿里云服务器的方法,零成本!这适用于日常测试学习,比如测试 Shell 脚本、学习 Docker 安装、MySQL 等等。跟着我的步骤,你将轻松拥有一个稳定可靠的服务器,为你的学习和实践…

数字化打破传统,引领企业跨界经营与行业生态盈利

在当今数字化时代,传统的赚货差思路正面临着巨大的挑战。然而,数字化的崛起为企业提供了突破传统束缚的机会,促使其转向跨界经营,并通过行业生态经营获取利润。 首先,数字化打破了传统赚货差思路的局限性。以往&…

【ARMv8/v9 GIC 系列 5.8 -- SPI 中断路由到指定的 core 详细介绍】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 SPI 中断路由配置寄存器字段代码示例Usage scenarioSPI 中断路由配置 在ARMv8和ARMv9架构下,当启用亲和性路由(Affinity Routing)时,系统寄存器GICD_IROUTER<n>用于提供具有INTID n的SPI的路由信息。n的最大值由公式(32*…

RocketMQ之消费者,消息拉取流程详解附源码解析

RocketMQ 消费者&#xff08;4&#xff09;消息拉取 流程详解 & 源码解析 1. 背景 本文是 RocketMQ 消费者系列的第四篇&#xff0c;介绍消息拉取的流程。 RocketMQ 的消费主要分推和拉两个模式&#xff0c;拉模式主动拉取消息&#xff0c;整个逻辑比较简单。本文着重介绍…

如何判断ip地址在同一个网段:技术解析与实际应用

在网络世界中&#xff0c;IP地址就像每个人的身份证一样&#xff0c;是识别和定位网络设备的关键。然而&#xff0c;仅仅知道IP地址还不足以完全理解其背后的网络结构和通信方式。特别是当我们需要判断两个或多个IP地址是否位于同一网段时&#xff0c;就需要借助子网掩码这一概…

【linux高级IO(二)】多路转接之select详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux高级IO 1. 前言2. 初识s…

SAP_SD_赠品(买A送B)

TCD:VBN1 例&#xff1a;买一台电脑送一个电脑包 VA01 看效果

错误记录-SpringCloud-OpenFeign测试远程调用

文章目录 1&#xff0c;org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name memberController: Unsatisfied dependency expressed through field couponFeign2&#xff0c; Receiver class org.springframework.cloud.netflix…

帕金森病友,保持心态小秘诀来啦!

大家好&#x1f44b;&#xff0c;今天想和帕友们分享一些保持好心态的小秘诀&#x1f4a1;。虽然帕金森病带给我们不少挑战&#xff0c;但心态可是咱们战胜困难的一大法宝哦&#xff01;&#x1f4aa; &#x1f340;接纳自己 首先&#xff0c;要学会接纳自己。帕金森并不定义我…

2024年有多少程序员转行了?

疫情后大环境下行&#xff0c;各行各业的就业情况都是一言难尽。互联网行业更是极不稳定&#xff0c;频频爆出裁员的消息。大家都说2024年程序员的就业很难&#xff0c;都很焦虑。 在许多人眼里&#xff0c;程序员可能是一群背着电脑、进入高大上写字楼的职业&#xff0c;他们…

HNU计算机系统课程总结与反思

HNU计算机系统这门课程用的是《深入理解计算机系统》第三版&#xff0c;作业题用的是第二版&#xff08;据说23届可能会全面改为第三版...&#xff09;。第三版对应64位系统&#xff0c;第二版对应32位系统&#xff0c;学了64位的反正没有坏处&#xff0c;是向下兼容的。这门课…

官宣定档!2025深圳电子展,开启全球招展工作

随着科技的飞速发展&#xff0c;电子信息产业已成为推动全球经济的重要力量。深圳&#xff0c;作为中国的硅谷&#xff0c;一直以来都是电子信息产业的前沿阵地。2025年&#xff0c;深圳电子展暨深圳国际电子信息博览会再次定档于4月份在深圳会展中心盛大召开&#xff0c;这不仅…

【数据分享】2024年公园绿地数据(全国/分省/分城市/免费获取)

公园绿地数据是我们在各项研究中经常使用的数据&#xff01;公园绿地数据虽然很常用&#xff0c;但是却基本没有能下载最近年份公园绿地数据的网站&#xff0c;所以很多人不知道如何获得公园绿地数据。本次我们为大家推荐的下载道路数据的网站是Open Street Map&#xff01;我们…

Nacos 注册中心和配置中心【实战】

前言&#xff1a; Nacos 是 alibaba 出品的微服务组件&#xff0c;Nacos 支持几乎所有主流类型的服务的发现、配置和服务管理平台&#xff0c;提供注册中心、配置中心和动态DNS服务三大功能&#xff0c;能够无缝对接 Springcloud、Spring、Dubbo等流行框架&#xff0c;本篇我们…

Hugging Face使用笔记

1. HuggingFace简介 Hugging Face Hub和 Github 类似&#xff0c;都是Hub(社区)。Hugging Face可以说的上是机器学习界的Github。Hugging Face为用户提供了以下主要功能&#xff1a; 模型仓库&#xff08;Model Repository&#xff09;&#xff1a;Git仓库可以让你管理代码版…

振弦式渗压计:水库大坝渗流监测的重要仪器

在水利工程领域&#xff0c;水库大坝作为重要的基础设施&#xff0c;其安全性和稳定性直接关系到下游人民的生命财产安全及国家经济的稳定发展。为了确保大坝的安全运行&#xff0c;对水库大坝进行渗流监测显得尤为重要。在众多监测仪器中&#xff0c;振弦式渗压计以其高精度、…

采用前后端分离技术架构+java语言开发的全套产科信息管理系统源码 可与医院HIS、LIS、PACS、RIS等系统进行对接

采用前后端分离技术架构java语言开发的全套产科信息管理系统源码 可与医院HIS、LIS、PACS、RIS等系统进行对接 什么是产科信息管理系统-建档管理&#xff1f; 产科信息管理系统建档管理通过信息技术实现了孕产妇健康信息的电子化、网络化和智能化管理&#xff0c;提高了医疗服…