【Create my OS】從零編寫一個操作系統

前言

相信每個自學操作系統的同學,大致學習路線都離不開 HIT-OS、MIT-6.S081、MIT-6.824、MIT-6.828等經典的公開課。但學習完這些經典公開課并完成相應的Lab,很多同學腦海中對于操作系統的知識其實都是零散的,讓你從頭開始編寫一個操作系統,我相信大部分人還是無從下手。因為Lab只是修改相應的核心模塊,對于整體系統的組織、模塊間的處理等細節,往往沒有人去關注,也就是說我們還需要進一步把這些概念串起來、鞏固起來。那么,我相信大部分人都有過一個想法:“我能不能自己寫一個操作系統”,這可能是大部分操作系統開發人員的夢想吧。

因此!本項目將展示如何從零開始使用 ANSI C 編寫出一個基于 64 位 RISC-V 架構的操作系統——Jokerix,該系統支持在內核上運行用戶態(User/Application mode)的終端,并輸入命令執行其他程序。

源碼公開:Joker001014/Jokerix (github.com)


目錄

0 前置知識 【Create my OS】0 前置知識 | JokerDebug (joker001014.github.io)

    0.1 RISC-V硬件機制0.2 RISC-V 匯編0.3 SBI 規范0.4 GDB 調試0.5 Jokerix 體系結構0.6 實驗環境

1 最小內核 【Create my OS】1 最小內核 | JokerDebug (joker001014.github.io)

    1.1 內核入口點1.2 生成內核鏡像1.3 使用 QEMU 運行1.4 封裝 SBI接口

2 開啟中斷 【Create my OS】2 開啟中斷 | JokerDebug (joker001014.github.io)

    2.1 RISC-V 中斷機制2.2 觸發斷點2.3 中斷上下文2.4 開啟時鐘中斷

3 內存管理 【Create my OS】3 內存管理 | JokerDebug (joker001014.github.io)

    3.1 Buddy System3.2 動態內存分配3.3 內存按頁分配框架3.4 基于線段樹的頁幀分配

4 虛擬內存 【Create my OS】4 虛擬內存 | JokerDebug (joker001014.github.io)

    4.1 Sv39內核映射4.2 實現頁表4.3 內核重映射

5 內核線程 【Create my OS】5 內核線程 | JokerDebug (joker001014.github.io)

    5.1 線程切換5.2 構造線程結構5.3 從啟動線程到新線程

6 線程調度 【Create my OS】6 線程調度 | JokerDebug (joker001014.github.io)

    6.1 線程管理6.2 調度線程6.3 Round-Robin 調度算法6.4 調度測試

7 用戶線程 【Create my OS】7 用戶線程 | JokerDebug (joker001014.github.io)

    7.1 創建用戶程序7.2 實現系統調用7.3 進程內存空間7.4 創建用戶進程

8 文件系統 【Create my OS】8 文件系統 | JokerDebug (joker001014.github.io)

    8.1 SimpleFS8.2 打包鏡像8.3 內核文件驅動8.4 文件系統測試

9 實現終端 【Create my OS】9 實現終端 | JokerDebug (joker001014.github.io)

    9.1 鍵盤中斷9.2 條件變量與輸入緩沖9.3 echo 程序9.4 實現終端

編寫代碼文件時間線:

步驟功能文件(斜體表示二次修改)
1CPU自檢,跳轉到Bootloader/
2將內核代碼從磁盤加載到內存(Bootloader),由OpenSBI提供:把 CPU 從 M-Mode 切換到 S-Mode,并跳轉到一個固定的地址 0x80200000/
3編寫內核入口點:設置OS啟動棧,跳轉到main.c執行kernel/entry.S
kernel/main.c
4entry.Smain.c 編譯和鏈接生成ELF文件(需存放在0x80200000),進一步生成二進制鏡像文件Makefile
kernel/kernel.ld
5QEMU加載鏡像文件,至此成功運行操作系統。/
6封裝SBI接口ecall;調用SBI接口實現 printf 功能kernel/sbi.h
kernel/printf.c
7封裝CSR讀寫;初始化中斷處理程序入口,設置斷點中斷處理程序kernel/riscv.h
kernel/interrupt.c
8保存和恢復中斷上下文信息kernel/context.h
kernel/interrupt.S
9初始化開啟時鐘中斷,設置時鐘中斷處理程序kernel/timer.c
kernel/interrupt.c
10基于二叉樹的動態內存分配,采用Buddy System Allocation算法kernel/heap.c
kernel/consts.h
11基于線段樹的頁幀分配kernel/memory.c
12設置頁表,將內核運行在虛擬地址空間kernel/kernel.ld
kernel/entry.S
13實現三級頁表,將內核各個段映射到頁表上kernel/mapping.c
14借助中斷恢復機制創建內核線程,及線程上下文切換kernel/thread.c
kernel/switch.S
kernel/context.h
15線程管理框架,創建調度線程kernel/processor.c
kernel/thread.c
16實現Round-Robin線程調度算法kernele/rrscheduler.c
17實現系統調用user/syscall.h
18實現用戶態printf、動態內存分配、用戶程序入口點、用戶測試函數user/io.c
user/malloc.c
user/entry.c
user/ulib.h
user/hello.c
19編譯用戶程序并鏈接,將用戶程序合并到內核user/Makefile
user/linkUser.asm
20處理用戶態系統調用kernel/interrupt.c
kernel/syscall.c
21編譯的用戶程序為ELF文件,實現ELF文件加載和內存映射kernel/elf.c
kernel/mapping.c
22創建用戶線程結構(創建用戶棧、創建內核棧、創建上下文)kernel/thread.c
kernel/mapping.c
23打包生成文件系統鏡像fs.img,將文件系統內容合并到內核mkfs/mksfs.c
mkfs/simplefs.h
kernel/linkFS.asm
Makefile
24從文件系統中找到 Inode,加載 ELF 文件數據到字節數組中kernel/fs.c
kernel/main.c
kernel/thread.c
25處理鍵盤中斷,實現條件變量,維護等待線程隊列kernel/queue.c
kernel/condition.c
kernel/interrupt.c
kernel/mapping.c
kerne/processor.c
26標準輸入緩沖區,維護緩存內容和條件變量kernel/stdin.c

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909251.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909251.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909251.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機視覺與深度學習 | 低照度圖像增強算法綜述(開源鏈接,原理,公式,代碼)

低照度圖像增強算法綜述 1 算法分類與原理1.1 傳統方法1.2 深度學習方法2 核心算法詳解2.1 多尺度Retinex (MSRCR) 實現2.2 SCI自校準光照學習2.3 自適應伽馬校正2.4 WaveletMamba架構3 開源資源與實現3.1 主流算法開源庫3.2 關鍵代碼實現4 評估與實驗對比4.1 客觀評價指標4.2 …

【工具教程】批量PDF識別提取區域的內容重命名,將PDF指定區域位置的內容提取出來改名的具體操作步驟

在企業運營過程中,時常會面臨處理海量 PDF 文件的挑戰。從 PDF 指定區域提取內容并用于重命名文件,能極大地優化企業內部的文件管理流程,提升工作效率。以下為您詳細介紹其在企業中的應用場景、具體使用步驟及注意事項。? 詳細使用步驟? 選…

【Java多線程從青銅到王者】定時器的原理和實現(十一)

定時器 定時器時我們日常開發中會用到的組件工具,類似于一個"鬧鐘",設定一個時間,等到了時間,定時器最自動的去執行某個邏輯,比如博客的定時發布,就是使用到了定時器 Java標準庫里面也提供了定時…

深入剖析AI大模型:Prompt 優化的底層邏輯

記得看到一篇NLP的文章,就 Prompt 時序效應的論文揭示了一個有趣現象,文章中說:模型對指令的解析存在 "注意力衰減" 特性 —— 就像人類閱讀時會更關注段落開頭,模型對 Prompt 前 20% 的內容賦予的權重高達 60%。這個發…

【備忘】PHP web項目一般部署辦法

【PHP項目一般部署辦法】 操作步驟 代碼: 把php項目代碼clone到指定位置如www/下新建php站點,填寫域名,把站點根目錄設置為項目根目錄項目入口設置,一般為public/項目權限改為766(特殊時候可設置為777),如果有特殊要求…

【60 Pandas+Pyecharts | 箱包訂單數據分析可視化】

文章目錄 🏳??🌈 1. 導入模塊🏳??🌈 2. Pandas數據處理2.1 讀取數據2.2 數據信息2.3 去除訂單金額為空的數據2.5 提取季度和星期 🏳??🌈 3. Pyecharts數據可視化3.1 每月訂單量和訂單金額分布3.2 各季…

玩轉Docker | 使用Docker部署vaultwarden密碼管理器

玩轉Docker | 使用Docker部署vaultwarden密碼管理器 前言一、vaultwarden介紹Vaultwarden 簡介主要特點二、系統要求環境要求環境檢查Docker版本檢查檢查操作系統版本三、部署vaultwarden服務下載vaultwarden鏡像編輯部署文件創建容器檢查容器狀態檢查服務端口安全設置四、配置…

晶振的多面舞臺:從日常電子到高精尖科技的應用探秘

在現代科技的宏大舞臺上,晶振宛如一位低調卻至關重要的幕后主角,以其穩定的頻率輸出,為各類電子設備賦予了精準的“脈搏”。從我們日常生活中須臾不離的電子設備,到引領時代前沿的高精尖科技領域,晶振都發揮著不可替代…

uni-app 小程序 Cannot read property ‘addEventListener‘ of undefined, mounted hook

在用 uni-app 開發微信小程序時,提示 Cannot read property addEventListener of undefined, mounted hook document.addEventListener("mousemove", this.touchmove) 在小程序開發里,addEventListener 并非通用的標準 API,不過與…

《專業小詞開課啦》——冪等

在系統對接過程中,當出現接口調用異常的情況時,程序員可能會用一些專業術語來答疑......對于0基礎同學,自然是需要自行百度一番,學習一下! 接下來,先學習【冪等】 PS: 小白參考1.1~1.4內容即…

滲透實戰PortSwigger Labs指南:自定義標簽XSS和SVG XSS利用

阻止除自定義標簽之外的所有標簽 先輸入一些標簽測試&#xff0c;說是全部標簽都被禁了 除了自定義的 自定義<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 當元素獲得焦點時&#xff08;如通過點擊或鍵盤導航&…

利用pycharm搭建模型步驟

1 如何將別人論文的代碼跑起來&#xff0c;以Pycharm為例&#xff0c;在下載代碼的時候&#xff0c;要注意使用的python版本是多少&#xff0c;并且要注意使用的keras和tensorflow等文件夾的版本&#xff0c;我們可以直接使用pycharm中file文件中的settings&#xff0c;來添加相…

Qt 中directoryChanged監聽某個目錄的內容是否發生變化

Qt 中&#xff0c;directoryChanged 是 QFileSystemWatcher 類的一個信號&#xff0c;用于監聽某個目錄的內容是否發生變化&#xff08;如添加、刪除文件或子目錄&#xff09; ? 一、功能說明 QFileSystemWatcher::directoryChanged(const QString &path) 信號的作用是&…

JavaWeb(Servlet預習)

案例1&#xff1a;基于jspServlet實現用戶登錄驗證 1.input.jsp <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset"UTF-8&q…

Docker Compose 部署 Prometheus + Grafana

安裝 docker-compose.yml version: 3.8services:# Prometheus 監控服務prometheus:image: prom/prometheus:latestcontainer_name: prometheusrestart: unless-stoppedvolumes:- ./conf/prometheus.yml:/etc/prometheus/prometheus.yml- ./prometheus_data:/prometheuscomman…

準確--使用 ThinBackup 插件執行備份和恢復

使用 ThinBackup 插件執行備份和恢復 導出&#xff08;備份&#xff09;步驟&#xff1a; 進入 Manage Jenkins > ThinBackup。設置 Backup schedule for full backups&#xff08;可選&#xff09;&#xff0c;并配置 Files to exclude&#xff08;可選&#xff09;。點擊…

Qt Creator 從入門到項目實戰

Qt Creator 簡介 Qt Creator 是一個跨平臺的集成開發環境&#xff08;IDE&#xff09;&#xff0c;專門用于開發 Qt 應用程序。它為開發者提供了一個強大的工具集&#xff0c;包括代碼編輯器、調試器、UI 設計器以及性能分析工具等。 1.1 Qt Creator 的安裝 Qt Creator 支持…

公司內網遠程訪問配置教程:本地服務器(和指定端口應用)實現外網連接使用

在數字化時代&#xff0c;企業的辦公模式日益多元化&#xff0c;遠程辦公、跨地區協作等需求不斷增加。這使得在公司內網中配置遠程訪問變得至關重要&#xff0c;它能讓員工無論身處何地&#xff0c;只要有網絡連接&#xff0c;就能便捷地訪問公司內部的各類資源&#xff0c;如…

邊緣計算如何重塑能源管理?從技術原理到應用場景全解析

在全球能源數字化轉型的浪潮中&#xff0c;一個看似不起眼的設備正在悄悄改變工業能效管理的模式 —— 這就是邊緣計算網關。以能源領域為例&#xff0c;傳統的 "設備 - 云端" 二層架構正面臨數據傳輸延遲、網絡帶寬壓力大、斷網失效等挑戰&#xff0c;而邊緣計算技術…

自主導航巡檢機器人系統解決方案

自主導航巡檢機器人系統解決方案 運動性能強大的通用型履帶式機器人底盤&#xff0c;整車采用克里斯蒂全獨立懸掛設計&#xff0c;內部搭載高扭矩無刷電機&#xff0c;通過精心匹配的底盤高度和功率配置&#xff0c;底盤表現出卓越的通過性能、低重心、平穩運行以及高效的傳動效…