项目主页https://github.com/reyoung/RayCommand。Wiki的主页https://github.com/reyoung/RayCommand/wiki。
BareBone版本是RayCommond的最基本的版本,仅仅实现了经由grub引导,在32位保护模式下向屏幕输出一个字符'A'。在阅读之下文章之前,请确定你了解基本的操作系统原理,GCC工具链,Makefile等基础知识。如果你有些许不了解,请参考http://wiki.osdev.org或http://osdev.sinaapp.com。
如果你想动手写你自己的操作系统,BareBone是你最基础的版本,你可以完全复制走这个版本的代码。代码的下载地址是https://github.com/reyoung/RayCommand/zipball/BareBone,使用NASM和i586-elf-gcc编译,推荐在Cygwin下构建交叉编译器和NASM
这个问题被广泛讨论,并且没有一个确实的答案。在于渊写的《自己动手写操作系统》中,几乎三分之一的内容在写一个bootloader。而我第一本如何写操作系统的书也是看得于渊这本。但是,我觉得基于我个人的能力,大多数的代码是汇编,并不能开发出一个真正的操作系统。我更喜欢有组织的写代码的方式。
另外,如果按照于渊的《自己动手写操作系统》中描述的那样,自己完全写一个bootloader,那么必须使用软盘或者U盘,完全格式化后,按照自己的意图,写启动扇区等工作。事实上,那样的操作系统,也没有办法真正的安装到电脑中。
当今,有很多通用的bootloader可供选用,例如grub,syslinux等等(事实上,我写的操作系统使用syslinux引导)。如果使用这些bootloader,只需要在内核上做出一点点设置即可。这样做,一来保证了通用性,二来使事情变得更加简单。同时,可以很容易的支持U盘引导系统,并且U盘还可以存储其他数据。这样子可以很简单的在自己的电脑上进行测试。所以,我个人选择了使用标准化的bootloader引导我的系统。
BareBone中仅仅有几个文件,其中Makefile是编译脚本,方便自动编译的。其他的三个文件列举如下。做一下简单的说明。
-
loader.S - GRUB等标准化bootloader启动后,调用loader.S中的loader函数,这是内核的入口点。这个汇编文件的作用就是分配一定量的栈空间,并调用外部的kmain函数(也就是调用C语言写的入口点)。
-
main.c - 顾名思义,内核的入口点。里面有个函数叫做kmain,被loader.S调用。
-
linker.ld - 链接脚本。grub等bootloader有一定的可执行文件格式,这里使用elf进行连接。具体的连接设置在这个链接脚本中。例如哪个段在哪个位置等等。
下面就每个文件进行更加细致的讲解。
这些文件都是可以找到源代码的。请从代码下载地址下载代码。
在loader.S的前几行EQU部分,定义一些常量,这些常量是为了告诉Grub这个内核是可以被引导的。当然,定义常量仅仅相当于C语言中的#define,并没有分配内存。
在section .text后,是代码段的开始。可以看到,在代码段开始的时候,分配了一个双字,将那些刚才定义的常量写下来。
在loader函数中,按照C语言的调用约定,加入了几个参数。并调用了kmain。这里使用了标准的Multiboot方式引导,具体可以参考Multiboot的相应文档。
在kmain结束后,系统进入一个死循环。这样子,就算是退出了。(事实上,后面会写关机的。只是先死循环在这)
loader.S使用
nasm -f elf -o loader.o loader.S
编译
在main.c中,首先检查了magic是否正确,也就是Multiboot是否正确的引导。如果不正确,就不能相信grub引导所提供的参数了(GRUB引导会提供一些参数,表示计算机当前的硬件情况,例如内存大小等)。
第二步,是直接对0xb8000位置的显存进行写操作。写入一个字符。默认的时候,在保护模式下可以对0xb8000进行写操作,输出到显示器上。
main.c使用
i586-elf-gcc -o main.o -c main.c -Wall -Wextra -Werror -nostdlib -fno-builtin -nostartfiles -nodefaultlibs
编译。
这里写了各种数据段代码段的安排,给连接器做脚本。连接时使用
i586-elf-ld -T linker.ld -o kernel.bin loader.o main.o
进行连接。
连接完毕后,就有一个可供启动的kernel.bin了。
如果仅仅有这么三个文件,一行一行的敲命令没有什么问题。但是,随着开发必然的情况是文件越来越多。这时候,我们需要一种方式帮我们自动化的编译。
我选择Makefile进行管理,这里写了一个Makefile示例,和上边所调用的编译命令一致。
这里选择qemu模拟器,这个模拟器与其他模拟器相比有几个优势。
-
可以直接载入内核文件,不需要创造镜像文件
-
可以模拟arm等其他CPU内核的文件
-
可以良好的模拟GUI(后期方便)
在安装好qemu的系统中,在含有kernel.bin目录中,运行qemu -vga std -kernel kernel.bin即可以启动系统。
或在RayCommand的根目录,输入make run,即可运行。
这里可以看到,对话框中第一个字母输出是A,证明程序正确的运行。(其他的字母仍在,是因为程序并没有清屏的工作)
分享到:
相关推荐
Livenation无服务器框架准系统 最低要求: AWS快捷键的Python 3.7 节点> = v10.15.2 npm> = 6.4.1 pipenv,版本2018.11.26 点> = 19.0.3 如何将此项目部署到AWS: sls deploy --account {用您的帐户名替换} –...
PHP和SQLite准系统项目-没有XAMPP 这是一个准系统项目,它显示您可以将PHP连接到SQLite数据库,而无需在系统上安装XAMPP。 感谢MainlyWebStuff编写了简短的“教程,这基本上就是该教程的基础。 安装该项目 sudo ...
express4-html-准系统示例 一个没有任何用于视图的模板引擎的准系统express4项目示例 只需克隆此存储库即可引导您表达4个项目。 这与Express 4生成器有何不同?... 1,克隆这个仓库 2.做npm安装 3.执行npm start
Barebone.js是Backbone.js的超级准系统实现。 这是为了什么? 使用简约,清新,不受质疑的框架以及可轻松解析的源代码来创建简单的Web应用程序。 以此作为学习资源,可以: 揭开MVC框架的神秘面纱了解Backbone....
XMC4500-准系统-项目该存储库托管了Infineon Technologies AG的XMC4500 Cortex-M4微控制器的各种裸机嵌入式系统项目。 这些示例针对的是或提供的评估板。 此处使用的示例是跨平台的(Windows,OSX和Linux),而不是...
Shopify准系统主题Shopify Barebone Theme是一个基于Node的自定义开发人员工作流/起点,用于创建真棒的Shopify主题,这是一种性感的方式! 这个存储库使我们大吃一惊,以支持玉器模板,模板部分,scss部分,合并和...
如果要在2006年以后安装在任何旧的64位PC /笔记本电脑上,请使用Daniel Hillenbrand AKA codeworkx的全部积分。
标题中的“Barebone Decision-Tree Framework-开源”指出我们讨论的是一个基本的决策树算法实现,而且是开放源代码的。这意味着这个框架提供了一个基础结构,开发者可以在此基础上进行扩展和定制,以满足特定的机器...
烤宽面条准系统使用Lasagna包的准系统API示例。用法要运行测试套件: npm test要查看测试覆盖率,请执行以下操作: npm run-script coverage要启动API: npm start要检查配置: npm run-script config
octoberCMS模型的准系统实现,因此您可以在原始应用程序中使用它,并添加一些基本的october / laravel实现 仍然需要进一步完善并使其美观,但是它可以工作,所以有点\ o / 安装 好了,您可以运行install.sh进行安装...
准系统-管理面板-Bootstrap-4 指示: 将.sql文件安装到您MySQL数据库在application / config / config.php中更改base_url 将application / model / Admin_model.php中的salt更改为其他随机变量(如果执行此操作,...
烧瓶准系统启动Flask服务器并运行所需的一切python文件链接到html文件。 html文件链接到js和css文件以及img文件夹。点点滴滴按原样下载存储库,然后从那里编辑文件。 不要删除任何文件夹,因为这是flask的正确文件...
准系统-nodejs-项目一个 node js 项目来启动你的 web 应用程序包含的包设置Angular.js 框架具有基本任务的 Gulp 构建工具用于图书馆管理的 Bower 包管理器如何设置运行$ npm install就大功告成了!项目结构 ./...
介绍 概括 该项目基于的Atlas构建脚本,该脚本基于客户端。该脚本使用作为确保类型安全的坚实基础。 功能列表 完全开源 打字稿 可扩展的文件夹结构 先决条件 alt:V服务器二进制文件 NodeJS 12以上 ...即将推出
要设置 CI 服务器,请按照的说明进行操作。 这个样板提供了一个完整的 build.xml 文件,在构建目录中有构建脚本。 自动运行单元测试、代码覆盖、垃圾分析、文档生成、样式检查所需的一切都包含在构建配置中。 所...
在开始深入探讨DA14580官方培训资料中文版1的内容之前,首先需要了解该培训资料是针对Dialog Semiconductor提供的DA14580芯片的SDK开发套件,版本为5.0.3。这本培训资料的主要目的是为了让使用者理解BLE(蓝牙低功耗...
LWC样板 最简单的LWC设置,用于简单的实验和错误复制。 $ npm run build # Build app $ npm run build -- --watch # Build app in watch mode $ npm serve # Serve local files
标题 "从PL访问psDDR的最少代码_Verilog_VHDL_下载.zip" 暗示了这是一个关于在Zynq SoC(System on Chip)平台上,使用Verilog或VHDL编程语言实现从可编程逻辑(PL)部分访问处理系统(PS)中的DDR内存的教程或代码...
准系统(Barebone System)是指不包含用户界面、图形系统或其他复杂功能的操作系统核心。它只包含最基本的组件,如内存管理、进程调度、设备驱动等,用于演示操作系统的基础功能。通过构建准系统,开发者可以学习到...
**威盛 ARTIGO A1150** 是一款由威盛电子(VIA)制造的小型化无壳计算机系统(Barebone System),它基于 **EPIA-P900 Pico-ITX 板** 构建而成,该板集成了诸多先进的技术和功能。此款无壳计算机主要面向嵌入式系统...