【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;底盘表现出卓越的通过性能、低重心、平稳运行以及高效的传动效…