如果你想手写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.rhkb.cn/news/372476.html

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

相关文章

强化学习编程实战-2马尔可夫决策过程

2.1 从多臂赌博机到马尔可夫决策过程 如图2-1,图中A为多臂赌博机,B为一堆鸳鸯,其中左上角为雄性鸳鸯,右上角为雌性鸳鸯,B展示的任务是雄性鸳鸯绕过障碍物找到词性鸳鸯。跟多臂赌博机不同的是,雄性鸳鸯经过一…

【SpringCloud应用框架】Nacos集群配置

第八章 Spring Cloud Alibaba Nacos之集群配置 文章目录 一、Linux版NacosMySql生产环境配置具体配置: 二、Nacos集群配置更改Nacos启动命令配置原理具体配置测试启动总结 一、Linux版NacosMySql生产环境配置 上一篇博客中已经了解了Nacos生产环境下需要搭建集群配…

angular 请求响应拦截

在module中provide 对请求做一些操作 对响应做一些操作 import { Injectable } from angular/core; import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpResponse } from angular/common/http; import { Observable, throwError } from rxjs; import { catc…

[ControlNet] Adding Conditional Control to Text-to-Image Diffusion Models

1、目的 让预训练好的大型DDPM模型支持额外的输入条件(如Canny edges、Hough lines、user scribbles、segmentation maps、human key points、shape normals、depths等) 不同于image-to-image translation致力于学习不同domain之间的映射,Con…

【Mac】Folder Icons for mac(文件夹个性化图标修改软件)软件介绍

软件介绍 Folder Icons for Mac 是一款专为 macOS 设计的应用程序,主要用于个性化和定制你的文件夹图标。以下是它的主要特点和使用方法: 主要特点: 个性化文件夹图标 Folder Icons for Mac 允许用户为 macOS 上的任何文件夹定制图标。你…

C嘎嘎:类和对象(一)

目录 面向过程和面向对象的初步认识 类的引入 类的定义 类的访问限定符及封装 访问限定符 封装 类的作用域 类的实例化 类对象模型 如何计算类对象大小 结构体内存对齐规则 this指针 this指针的引出 this指针的特性 类的6个默认成员函数 构造函数 概念 特性 …

前端vue打印后端对象为[object,object]

今天给自己项目进行编写前端页面时,惊讶的发现,自己进行打印后端传递的对象,一直显示未[object,object],如下图所示: 感觉很奇怪,于是我猜测是不是自己获取的返回数据的问题,在进行添加了datat…

关于Linux的操作作业!24道题

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

Sleuth--链路追踪

1 链路追踪介绍 在大型系统的微服务化构建中,一个系统被拆分成了许多模块。这些模块负责不同的功能,组合成 系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建 在不同的软件模块集上&am…

鸿蒙‘ohpm‘ 不是内部或外部命令,也不是可运行的程序-解决方案

🔥 博客主页: 小韩本韩! ❤️ 感谢大家点赞👍收藏⭐评论✍️ 在鸿蒙的DevEco Studio的终端下输入 ohpm -v 或者 你需要下载第三方ohpm包的时候提示‘ohpm‘ 不是内部或外部命令,也不是可运行的程序- 主要是因为我们…

Redies基础篇(一)

Redis 是一个高性能的key-value数据库。Redies支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的&#xff…

idea2024破解安装教程

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 目录 🌤️下载安装 &a…

基于Java Web的考编论坛网站的设计与实现+lw+源码+讲解+调试+视频演示

第3章 系统分析 用户的需求以及与本系统相似的在市场上存在的其它系统可以作为系统分析中参考的资料,分析人员可以根据这些信息确定出本系统具备的功能,分析出本系统具备的性能等内容。 3.1可行性分析 尽管系统是根据用户的要求进行制作,但…

ElasticSearch学习篇14_《检索技术核心20讲》进阶篇之大倒排索引

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243,文档形式记录笔记。 内容 主要是海量数据的大倒排索引的一些原理设计思想,ES底层就是基于这些设计思想以及原理,主要涉及读写分离、索引分层等…

CSS上下悬浮特效

要实现一个上下悬浮的特效,可以使用CSS的keyframes规则和动画属性。以下是一个简单的示例: 代码示例 /* 定义一个名为floating的动画 */ keyframes floating {0% {transform: translateY(0); /* 初始位置 */}50% {transform: translateY(-4px); /* 向上…

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

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

cfDNA甲基化疾病早筛研究思路分享

游离DNA(Circulating free DNA,cfDNA)是人体组织释放到血液等循环体系中降解的DNA片段,是一种新型的肿瘤分子标志物。ctDNA甲基化是重要的表观学修饰之一,可以在不改变基因序列的情况下,改变遗传表现&#…

【基于R语言群体遗传学】-13-群体差异量化-Fst

在前几篇博客中,我们深度学习讨论了适应性进化的问题,从本篇博客开始,我们关注群体差异的问题,建议大家可以先看之前的博客:群体遗传学_tRNA做科研的博客-CSDN博客 一些新名词 Meta-population:An interconnected gro…

名企面试必问30题(二十七)——你能为公司带来什么呢?

回答一: “首先,我具备扎实的软件测试专业知识和丰富的实践经验。我能够运用各种测试方法和工具,确保公司产品的质量,降低产品上线后的风险。 其次,我善于发现问题和解决问题。在测试过程中,我不仅能找出软…

Open3D 从体素网格构建八叉树

目录 一、概述 1.1体素网格 1.2八叉树构建 1.3应用 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2体素网格 3.3八叉树 3.4体素网格 一、概述 八叉树(Octree)是一种树状数据结构,用于递归地将三维空间划分为…