如果你想手寫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.pswp.cn/web/42266.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42266.shtml
英文地址,請注明出處:http://en.pswp.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,即外包派遣,是華為和外企德科…

金蝶云蒼穹-插件開發(三)關于基礎資料/單據實體的id

基礎資料/單據實體的id 每個基礎資料和單據的實體,都有一個id字段,這個id是其一個唯一性標識,就類似于這個實體的身份證號一樣。通常,這個id用來找到指定的實體。這個id在代碼中都是long類型接收的。 如果基礎資料/單據里面有字…

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高可…

痙攣性斜頸對生活有哪些影響?

痙攣性斜頸&#xff0c;這個名字聽起來可能并不熟悉&#xff0c;但它實際上是一種神經系統疾病&#xff0c;影響著全球數百萬人的生活質量。它以一種無法控制的方式&#xff0c;使患者的頸部肌肉發生不自主的收縮&#xff0c;導致頭部姿勢異常。對于患者來說&#xff0c;痙攣性…

和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;打造出一個既具科技感…