使用rust自制操作系统内核

一、系统简介

本操作系统是一个使用rust语言实现,基于32位x86CPU分时操作系统

项目地址(求star):GitHub - CaoGaorong/os-in-rust: 使用rust实现一个操作系统内核

详细文档:自制操作系统 · 语雀

1. 项目特性

在本项目的实现上,我认为该项目有一下特性:

特性

说明

rust语言实现

市面上很多操作系统项目使用的C语言实现,我这里使用的rust实现,可以保证这个项目的代码由我手写实现。也体现了该项目的独特和新颖。

基于x86 CPU

x86是市面上最常见的CPU,基于这种通用大众化的CPU,也能说明本项目用到的知识的通用。

拥有OS的基本功能

本项目在实现操作系统的功能上,算得上是“麻雀虽小,五脏俱全”。基本操作系统的核心功能都实现了:

  • BIOS启动、Mbr引导、Loader加载内核
    • 使用BIOS启动,Mbr引导操作系统,手写Loader 进入保护模式、加载段描述符、开启分页
  • 中断管理
    • 实现各种中断:CPU异常中断、键盘中断、硬盘中断等等常规中断
  • 内存管理
    • 使用页表管理内存,实现进程的虚拟内存,进程独享4GB内存空间
  • *线程和进程管理
    • 实现内核线程和用户进程,其中包括PCB的属性的设计,线程和进程的启动、执行,任务的管理、调度。
  • 系统调用(基于中断)
    • 在实现用户进程后,用户进程处于3特权级下,想调用内核高级功能就得通过系统调用。本系统实现了系统调用,让用户进程跟内核交互。
  • *文件系统
    • 本系统实现了一个最小化并且全面的文件系统,实现了文件、目录的层级结构,支持在文件系统对文件以及目录的 增、删、改、查。对于文件和目录的常规操作都有支持。并且支持从硬盘加载程序并且执行
  • Shell交互
    • 本系统提供了Shell作为人跟系统交互的桥梁,在Shell读取命令然后执行。Shell实现了管道,支持多个进程间通信

 

这里只是对系统的基本介绍,详细的介绍可以看下面更加详细的介绍。

mbr启动、Loader引导

本系统使用比较古老的BIOS启动,手写Mbr启动,并且手动实现Loader对系统进行引导。(mbr和loader均为rust实现)

没使用任何第三方crate

在市面上很多rust的系统引用了很多第三方的crate,比如blog_os和rCore os。本系统不使用任何第三方crate,所有功能都使用rust的core手动实现。

 

2. 项目结构介绍

如下图是该项目的文件结构:

 

0696cb71a01b14081d5872ab92c38595.png

下面我挑几个重点的模块介绍:

模块名称

模块类型

模块介绍

build

makefile生成

make之后生成的文件

cat

用户程序(独立进程)

(写入到文件系统,然后shell可以加载成为一个进程运行)

自制的cat程序,把文件系统中的文本文件内容输出到控制台

echo

自制echo程序,把echo命令跟着的字符串输出到控制台

grep

自制grep程序,根据输入内容,进行过滤,然后输出到控制台

common

操作系统内核 源码

common包,loader、loader2、kernel都会用到的常用工具

mbr

mbr启动(16位),该模块就两个功能:

  • 实现mbr规范,引导BIOS
  • 加载loader(读取硬盘)

loader

loader启动(16位):

  • 加载选择子、打开GDT,进入保护模式
  • 加载loader2(读取硬盘)

loader2

loader2启动(32位):

  • 由于loader生成的指令是16位的,因此在进入保护模式后,需要再进入到loader2执行
  • 加载kernel(读取硬盘)

kernel

进入内核的最终实现,包括中断、内存管理、线程进程管理、文件系统等等操作系统核心,都在这个模块

rrt

Rust RunTime library

我自制简单的用户程序运行时库,模仿了crt。为用户程序封装了_start入口和exit的调用。

target

cargo生成

rust使用cargo生成的二进制文件。忽略

tests

单元测试

在这个项目实现中,我写的简单的单元测试

3. 项目环境介绍

这里我介绍一下项目的开发环境和运行环境。

 

开发环境(最终是生成一个32位的基于x86的操作系统二进制文件):

名称

版本信息

操作系统

MacOS

Ventura 13.0.1

CPU

Apple M1

 

编译器

rustc

rustc 1.82.0-nightly (5aea14073 2024-08-20)
binary: rustc
commit-hash: 5aea14073eee9e403c3bb857490cd6aa4a395531
commit-date: 2024-08-20
host: aarch64-apple-darwin
release: 1.82.0-nightly
LLVM version: 19.1.0

包管理工具

cargo

cargo 1.82.0-nightly (ba8b39413 2024-08-16)
release: 1.82.0-nightly
commit-hash: ba8b39413c74d08494f94a7542fe79aa636e1661
commit-date: 2024-08-16
host: aarch64-apple-darwin
libgit2: 1.8.1 (sys:0.19.0 vendored)
libcurl: 7.84.0 (sys:0.4.74+curl-8.9.0 system ssl:(SecureTransport) LibreSSL/3.3.6)
ssl: OpenSSL 1.1.1w  11 Sep 2023
os: Mac OS 13.0.1 [64-bit]

自动化工具

make

GNU Make 3.81

elf文件二进制提取工具

x86_64-linux-gnu-objcopy

GNU objcopy (GNU Binutils) 2.41

elf文件dump工具

x86_64-linux-gnu-objdump

GNU objdump (GNU Binutils) 2.41

 

运行环境(把这个x86的32位的操作系统镜像运行在虚拟机中):

名称

环境版本信息

虚拟机

qemu-system-x86_64

QEMU emulator version 8.2.1

虚拟机2

bochs

Bochs x86 Emulator 2.8

 

这里不得不说rust的跨平台开发能力太好了,我在Mac M1上开发,生成一个 x86 的 ELF文件。然后在启动一个qemu虚拟机运行。

 

4. 项目运行效果

这里给大家展示一下我的操作系统的基本功能。

下面我从这几个方面来展示:

  • 内置命令
  • 文件系统操作
  • 从文件系统加载进程
  • Shell多进程通信(管道)

 

4.1. 内置命令

先看内置命令,目前我的系统内置了如下命令(排除文件系统操作和加载可执行文件):

命令名称

命令用途

命令展示

pwd

展示当前工作目录

 

6a64c346b9f127d30b17112e0941bb61.png

ps

查询当前的所有任务

 

03dabb95755c5b77382e563de37d5591.png

clear

清屏

 

ctrl + l快捷键

清屏

 

ctrl + u快捷键

删除当前行的输入

 

这是一些基础并且跟功能无关的命令。下面请看我们使用操作系统中,最常用的文件系统相关的命令。

4.2. 文件系统命令

我们使用一个操作系统,最常用的一定是文件系统相关的命令,比如「文件的增、删、改、查」、「目录的增、删、改、查」。我在本系统中基本都实现了,如下表所示:

命令名称

命令用途

命令展示

ls

展示当前目录下的所有文件。

 

40f0dd72b76e1f56064d856340f140d1.png

这里的catgrep是可执行文件

ls -l

展示当前目录下的文件细节

 

b2d45385eda46425fb13964e243388c3.png

file_type中,"-"表示普通文件,"d"表示文件夹

cd

切换当前工作目录

 

78e18d523b9bf2e8b7152f10d940b297.png

mkdir

在当前工作目录下,创建一个目录

 

5bf8443040a918e7a9dbc36f79322dcb.png

rmdir

删除某个目录名称

 

810e377e6349514323a9dc9ed8fa54a1.png

touch

创建一个普通文件

 

0622215b59312b93d6d1665be56b3e11.png

创建了一个名为"file"的普通文件

 

看到这里可能会问,怎么没有读写文件的命令?我们一般使用cat命令读取文件,并且我们会使用echo hello > hello.txt来写入文件。

 

这个catecho命令是我写的用户程序,这种程序是属于从硬盘加载后作为进程执行的。因此这个放到下一节。

4.3. 从文件系统加载进程

上面讲的都是内置的命令,都比较简单而且固定。下面就是要从文件系统加载可执行程序执行了。

在上面讲项目结构中,我提到我实现了3个用户程序,作为小工具:

 

42d97908129ee21820a210b216de742e.png

这三个小工具分别是:

  • cat:把一个文件的内容输出到控制台
  • echo:把命令后面跟着的字符串输出到屏幕
  • grep:使用正泽匹配过滤输入,然后把过滤后的结果输出

 

本小结,我就展示catecho实现读、写一个文件。

命令名称

展示效果

echo

 

abde56f6031435916fb6d2a93c40f59c.png

我这里先创建「hello.txt」文件,然后把"hello"字符串写入到 hello.txt文件中

cat

 

55fe9d54d813d7fc052b71d5dac3ce3b.png

我这里使用cat命令,把hello.txt的文件内容输出

">"和">>"输出到文件

 

b42f8060efcb6843d9808bd1e05dbd72.png

这里使用echo 和 ">>" 追加 数据到 hello.txt文件中

这里我简单展示了echocat的执行效果。

这里得注意,echocat是两个在文件系统的文件这里体现出来的是 把 可执行文件 从文件系统加载到内存,然后成为一个独立的用户进程执行的过程

4.4. Shell多进程通信(管道)

另外我们在Shell常用的一个功能就是“管道”,这个也是进程间通信的一种方

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值