MiniOS 是我在研究生导师的指导下参与开发的一个微型操作系统内核,接触 MiniOS 的开发有一段时间了,对其已经比较熟悉,便着手为 MiniOS 写了一个简要的介绍,下面是介绍内容(同时也是 MiniOS 在 GitHub 仓库的自述):


MiniOS 简介

MiniOS 是一个面向操作系统开发学习者的、微型的操作系统内核,可以运行在32位 x86 架构的 CPU 上。MiniOS 专注于对操作系统开发中的核心概念和基础原理的学习与研究,并基于通用硬件对操作系统中的各基本子系统或模块进行实现。

流行的 Linux 、 FreeBSD 等操作系统内核固然很好,然而它们却并不适合内核开发的初学者。一方面,这些操作系统内核已经发展了很多年,积累了十分庞大的代码量(发布于 2005 年的 Linux 内核早期版本 v2.6.12 就已经有大约 400 万行代码),另一方面,因为应用在生产环境中的需要,这些内核代码中包含了大量和操作系统基本原理无关的细节,初学者很难抓到其中的要领。因此,从一个简单的、代码量较少的操作系统内核入手,使用较短的时间熟悉并掌握操作系统内核开发领域的核心概念和基础原理,等把这些基础性知识掌握到一定程度,再投身于 Linux 等实用内核的开发,对于内核初学者来说是一个比较现实可行的策略。即使不打算从事内核开发,通过一个易于入手的内核学习一些操作系统相关的基础知识,也会有利于写出更健壮、性能更好的应用程序。

  • MiniOS 的GitHub仓库地址是 https://github.com/doubleXnine/MiniOS
  • 查看 MiniOS 的 release_notes 可了解 MiniOS 的当前开发进展。

MiniOS 开发工具

MiniOS 主要基于 C 语言和 x86 汇编语言开发,使用的开发工具包括:

  • 汇编器 nasm
  • C 语言编译器 gcc
  • GNU 二进制工具集 Binutils
  • 项目构建工具 make
  • 调试器 gdb

其中,Binutils 是一套对二进制文件进行操作的工具集,包括创建静态库的工具 ar,从二进制文件中去除符号表以减小文件体积的工具 strip 等。

运行 MiniOS

MiniOS 当前从软盘中启动,启动流程为:

  1. BIOS 自检完毕后从软盘引导扇区中加载引导程序(boot.bin)至内存,并将控制权交给引导程序。
  2. 引导程序从软盘中读取加载器(loader.bin)至内存,并将控制器交给加载器。
  3. 加载器运行时会从软盘中读取 MiniOS 内核(kernel.bin)至内存,然后从 CPU 的实模式进入保护模式,并将控制权交给内核。
  4. MiniOS 开始运行。

由于 MiniOS 是一个面向学习者的操作系统内核,因此目前主要运行在虚拟机中,可选的虚拟机有 Bochs 和 Qemu 。

在 Bochs 中运行 MiniOS

  1. 安装 Bochs,在 Ubuntu 系统下可以直接执行命令 sudo apt-get install bochs 进行安装,也可以先下载 Bochs 的源码再进行编译安装,通过源码进行安装可以选择想要的 Bochs 版本。
  2. 进入 MiniOS 源目录,执行 tar zxvf misc/80m.img.tar.gz . ,从硬盘镜像压缩包中解压出硬盘镜像。
  3. 在当前目录下执行 bochs 命令启动 Bochs 虚拟机,Bochs 首先会从 bochsrc 文件中读取配置信息,然后对 Bochs 给出的运行提示信息进行确认便可让MiniOS 在 Bochs 内运行。

在 Qemu 中运行 MiniOS

  1. 安装 Qemu,在 Ubuntu 系统下可以直接执行命令 sudo apt-get install qemu-system-x86 进行安装,也可以下载 Qemu 的源代码进行编译安装。
  2. 进入 MiniOS 源目录,执行 tar zxvf misc/80m.img.tar.gz . ,从硬盘镜像压缩包中解压出硬盘镜像。
  3. 在当前目录下执行 ./launch-qemu.sh 命令启动 Qemu 虚拟机,之后 MiniOS 将直接在 Qemu 内开始运行。Qemu 虚拟机没有使用像 bochsrc 一样的配置文件,配置信息是通过命令行选项指定的,脚本 launch-qemu.sh 中包含了当前使用的配置选项。

调试 MiniOS

通过使用 Bochs 或 Qemu 中自带的调试功能可以对 MiniOS 进行汇编语言级的调试,但由于汇编程序比较冗长且难以阅读,这种调试方式使用起来不太方便。幸运的是,Bochs 和 Qemu 中都内置了 gdb 支持,通过和 gdb 提供的远程调试功能配合,可以对 MiniOS 进行 C 源码级的调试。

使用 Bochs+gdb 调试 MiniOS

  1. 从源代码编译安装 Bochs,并在编译时打开 gdb 支持选项。然后在 Bochs 配置文件中添加 gdb 配置信息,MiniOS 源目录下的 bochsrc-gdb 文件中已经包含了所需的配置选项。
  2. 在 MiniOS 源目录下执行 ./launch-bochs-gdb.sh ,所运行的 shell 脚本会在一个新的终端窗口中运行 gdb,并加载 debug 版的内核二进制文件。
  3. 在 gdb 命令界面执行命令 target remote :2345 和 Bochs 建立连接。
  4. 用 gdb 像调试本地程序一样对 MiniOS 进行调试。

使用 Qemu+gdb 调试 MiniOS

  1. 在启动 Qemu 时添加命令行选项以启用 gdb 支持,MiniOS 源目录下的脚本文件 launch-qemu-gdb.sh 中已经添加了所需的配置选项。
  2. 在 MiniOS 源目录下执行 ./launch-bochs-gdb.sh ,所运行的 shell 脚本会在一个新的终端窗口中运行 gdb ,并加载 debug 版的内核二进制文件。
  3. 在 gdb 命令界面执行命令 target remote :1234 和 Qemu 建立连接。
  4. 用 gdb 像调试本地程序一样对 MiniOS 进行调试。

常用 MiniOS 构建选项

# 编译 MiniOS 内核和用户程序 init,并写入到软盘镜像 a.img 中
make image
# 清除所有 .o 目标文件
make clean
# 清除所有 .o 目标文件和可执行文件
make realclean

参考资料

  • Orange’s ,由于渊开发的一个微型操作系统,在《一个操作系统的实现》这本书中讲述了 Orange’s 的开发过程。MiniOS 是基于 Orange’s 进行开发的。
  • xv6 , 由 MIT 开发的一个用于教学的微型操作系统,xv6 由 Unix V6 改写而来,被应用在 MIT 的操作系统课程 6.828: Operating System Engineering 中。
  • Minix ,最初由 Andrew S. Tanenbaum 教授开发的一个微内核操作系统,Linus 在开发早期的 Linux 的时候从 Minix 处继承了很多特性,于渊在开发 Orange’s 的时候也多次借鉴了 Minix 中的做法。

一个微型的操作系统内核 MiniOS相关推荐

  1. 构造一个简单的操作系统内核,详解进程切换细节

    (1)基本功能介绍 如题,本文将介绍如何构造一个简单的操作系统内核(基于内核版本3.9.4 ).它有以下功能: 1:进程的管理 2:进程的初始化 3 : 进程基于时间片的调度 (2)实操步骤 1 安装 ...

  2. java 0xf0_用java做一个最小的操作系统内核

    (系列视频实战可观看网易云课堂: Linux kernel Hacker, 从零构建自己的内核 ) 用java来做操作系统内核,太搞笑了吧.如果你这么想,同时嘴上发出呵呵一笑.那么我这篇文章的目的也算 ...

  3. linux实验三:基于mykernel 2.0编写一个简单的操作系统内核

    实验内容 按照https://github.com/mengning/mykernel的说明配置mykernel 2.0,熟悉Linux内核的编译:基于mykernel 2.0编写一个操作系统内核,参 ...

  4. 用java做一个最小的操作系统内核2.

    上一节,我用java制作了一个虚拟软盘,当把软盘插入虚拟机,启动机器后,屏幕打印出java程序中设定的语句,然后卡死. 在java代码中,有一个二进制数组,imgContent, 它里面存储的实际上是 ...

  5. 怎样向一个外行人解释操作系统内核?+一篇有关将黑客帝国比作操作系统的旧文

    原文链接:http://ivoras.net/blog/tree/2014/Jul-how-do-you-explain-an-os-kernel-to-a-layperson-an-old-text ...

  6. Linux 迎来 29 岁:从个人爱好到统治世界的操作系统内核

    喜欢就关注我们吧! 1991 年的 8 月 25 日,来自芬兰赫尔辛基大学的 Linus Torvalds 用 Minix 操作平台建立了一个新的操作系统内核,并把它发回 Minix Usenet 新 ...

  7. C++实现简单的操作系统内核

    C++是一门强大的系统级编程语言,学习一门语言最好的方式就是动手去实现一些小项目. 本Chat将带大家从0开始用尽量简单的方式实现一个简单的操作系统内核,以下为系列文章的目录. 简单的文本输出,实现H ...

  8. 【转载】笔记:计算机_体系结构_操作系统_软件_操作系统内核_GNU_Linux_C_Python_Latex_Java_TCP/IP_MacOS_Windows这些词语的历史,关系

    一.计算机的发明 世上本无路,走的人多了,就有了路.世上本无计算机,琢磨的人多了--没有计算机,一切无从谈起. 三个人对计算机的发明功不可没,居功至伟.阿兰·图灵(Alan Mathison Turi ...

  9. java写linux内核,基于mykernel 2.0编写一个操作系统内核

    一.实验要求 1.按照https://github.com/mengning/mykernel 的说明配置mykernel 2.0,熟悉Linux内核的编译: 2.基于mykernel 2.0编写一个 ...

最新文章

  1. Js 原型对象与原型链(转)
  2. pytorchyolov4训练_使用pytorch-yolov5 訓練自己的數據集-2020.6.15
  3. 【C++ 学习笔记】 MFC CEdit
  4. 2.2基本算法之递归和自调用函数_7592 求最大公约数问题
  5. sort ascend matlab,MATLAB sort函数用法
  6. 分奇偶数c语言_小白学写字(C语言)
  7. 给定字符串,实现大小写之间的转换
  8. JS 日期格式和时间戳相互转化
  9. 华为路由器内部服务器地址映射不起作用,第一次买华为AR2204-s路由,内部服务器映射问题...
  10. flutter 仿微信朋友圈发布图片
  11. 安装win10时,显示windows 无法安装到这个磁盘,选中的磁盘具有mbr分区表
  12. 【NOI2018】你的名字(后缀自动机,线段树合并)
  13. vsftpd的安装及使用
  14. python实现模仿银行ATM机
  15. 网站QQ扫码登录代码及详细说明
  16. java编程初学者要注意的几点
  17. fstat、stat和lstat用法
  18. linux添加ec20,i.MX6添加EC204G模块GOBI驱动
  19. 如何在Keil uVision5建立飞思卡尔K60开发板的工程
  20. 互联网废品回收+废品回收小程序开发这些实际功能要有

热门文章

  1. 米的换算单位和公式_小学数学单位换算公式大全
  2. Spark项目实战:购物网站评价标签生成(非常详细的Spark算子操作)
  3. 访问局域网另外一台电脑虚拟机中CentOS7
  4. html5 窗口 最小化,HTML5 窗口最小化动画(先压扁后变窄)
  5. 一个利用html5的图片裁剪功能(已解决ios压扁缩放等bug)
  6. 企业微信怎么通过手机号添加好友?企业微信添加好友话术!
  7. 玩3D游戏头晕怎么办?为什么会头晕?如何解决?
  8. Nlp SBD 文本断句 包含中文 和英文断句
  9. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  10. 常见夸张标题,博人眼球