从1开始写操作系统

本文介绍了一个从头编写的简单类Unix内核,支持x86和arm架构,尤其关注raspi2b。开发在qemu上进行,以降低硬件依赖。内核以C语言编写,采用宏内核设计,目前仅支持32位和单核。内容涵盖内存管理、中断、系统调用、驱动和进程管理。未来计划包括多核支持和更多驱动。开发工具为vim + coc + clangd-12。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

一个简单的类unix内核,目前准备支持x86和arm架构,其中arm目标支持平台是raspi2b。在本系列文章中主要用arm的代码作为例子,原因是x86架构有较重的历史负担导致编码异常困难,但是x86部分我也差不多写了个大概,两者代码会考虑的。主要参考已有的类unix内核,xv6/FreeNOS/linux,重写一个通用的类unix的内核,并且提供一个最小根目录文件系统,验证可行性。

选择x86和raspi2b的另一个重要原因是qemu支持模拟这两种硬件型号,降低对实际物理硬件的依赖和调试难度。

开源代码地址

借用sqlite作者的话:

May you do good and not evil.
May you find forgiveness for yourself and forgive others.
May you share freely, never taking more than you give.

https://github.com/5dplay/tiny-kernel-v2.git

局限

  • 目前仅在qemu上开发, 需要格外支持 才能在硬件机器上正常工作。
  • 由于时间精力以及能力有限,目前的实现 仅支持32位,即使是arm也仅使用aarch32指令集。
  • 仅支持单核,多核与单核相比多的是一系列并发处理上的问题,不影响整体框架。后续若是有精力再单独讨论smp相关的实现。
  • 无论是内存管理还是其他的基本采用最简单的实现方式,但会提供接口以供他人编写出更酷的实现方式。
  • BootLoader目前没有计划考虑支持。
  • 驱动支持列表少。

路线图

    1. 工具链 && 编译环境搭建
    1. 启动
    1. 内存管理
      1. 内存布局
      1. 虚拟地址映射
      1. 内存分配管理
      • 1.内核空间
      • 2.用户空间
    1. 中断管理
      1. 中断服务例程
      1. 中断API
      1. 系统调用
    1. 驱动
      1. 存储管理器 IDE(x86)/eMMC(raspi3b)
      1. 串口(x86可选,raspi2b必选)
      1. 键盘(x86可选)
    1. 进程管理
      1. 第一个进程init
      1. 调度
    1. 文件系统
    • 1.索引式文件系统(必选)
    • 2.FAT式文件系统(可选,并且支持力度不够,不必强行兼容)
    1. 系统调用
      1. 文件系统相关
      1. 进程调度相关

整体架构

整体框架参考linux,分别为内存管理,文件系统,进程管理,中断,驱动。

代码目录

整体代码目录参考linux

FAQ

为什么使用宏内核而不是微内核?

我个人开发上对宏内核更加熟悉,并且使用宏内核有助于理解linux的设计和实现。如果对微内核有兴趣不妨去看一下FreeNOS?

为什么使用C语言而不是别的更为高级语言(C++/Go/Rust)?

其他高级语言都极大程度屏蔽底层硬件的差异性,并且或多或少有运行时支持(在裸机上需要自己实现这些运行时支持的接口)。可以这么认为,在内核编程方面,其他高级语言除了语法糖好看一点之外,和C语言并没有更多可取之处,而后者对硬件的表达能力更强。作为一个玩具级别的内核,没必要折腾高级语言。

IDE?

看个人选择,我是在ubuntu20.04下做开发的,所以选择的是vim + coc + clangd-12。windows下选择也挺多的,此外轻量级一点的vscode也不错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值