ZeroOS—第0章—简要介绍

写在前面

头次开始写一个系列的博客,首先希望我能高质量的完成它,同时也希望各位大佬在阅读的时候给出宝贵的意见,如果有任何不爽可以轻喷但最好不喷,萌新在此感谢各位了。

ZeroOS是个什么东西

顾名思义,这是一个操作系统,暂且这么称呼它吧,或者可以叫简易的、符合GRUB多启动规范的操作系统内核(现在能用但确实不太完善),它的内核结构和Linux内核的结构类似(应该可以叫类Unix内核吧),结构如图:

ZeroOS诞生之路

ZOS的诞生之路其实就是我自己学习写操作系统的路程,让我想想当初是怎么踏进这条路的,那貌似是在大一写C语言课程设计的时候,那是一个药品管理系统,头一次写这么大的C程序的我是错误百出,只好面向百度编程,忘了是在查找什么错误的解决方法时,百度之后在网页的右边推荐了几本书,一般我都是不看这个板块的,但是那天瞥了一眼之后发现推荐了一本《30天自制操作系统》,我带着严重的怀疑点了进去(我去,我不是在排错吗???)。

随着不断的阅读,我的怀疑渐渐变成了震惊,接着转化为学习写操作系统的决心,然后果断买了一本纸质书(贫穷使我谨慎),还带了位室友入坑,接着又搞了一手软盘(其实没啥必要,就是觉得应该学的隆重一点),然后一头扎进操作系统知识的海洋中。接着问题就来了,海洋用x86保护模式这个大浪给我拍到了岸上,几番折腾后放弃了,查找了一段时间(几周到几个月不等)的资料后又捡起来接着学,这样的过程在大一到大三的三年里重复了不知道多少次,拿起来又被迫放下,又拿起来又不得不放下(似乎有点舔狗的味道)。。。

直到在啃完了单片机这个课程后,我突然对编写调试操作系统有了一种握在手心的感觉(舔狗舔到最后应有尽有),从这时起,对类Unix操作系统有了一个整体的认识,并且决定了要拿这个操作系统当做毕业设计做(当时胆子真大,做不完延毕了怎么办),然后就在大四和一起入坑的室友共同完成这个操作系统内核,接着快乐的寒假变成了“快乐”的写BUG。在这里要感谢我的室友,在确定内核的发展方向时他给出了十分正确的意见,当时我主张写一个类似《30天自制操作系统》那样的,就是比较随意,随心而动,随刃而行,大概确定几个模块后就看心情了,而我室友则是主张写一个规范的,已有的成功的操作系统,就比如像Linux那样的,不需要全部实现,只要框架和Linux内核一样就可以了。事实证明室友的决定非常正确,这不仅确定了工作量,方便了写报告,而且对于ZOS以后的扩展十分有益。

最终,我们完成了这个内核的模块编写,模块测试,模块组装,运行HelloWorld用户程序,显示出HelloWorld,室友很激动,我很冷静,然后现在我一边敲字一边很激动(怕是以光年为单位的反射弧吧),然后就有了ZeroOS。

写这个小节呢,唯一的目的就是想告诉屏幕前的你,学习编写操作系统真的难,需要极大的耐心,但同时也说明它也不是绝对学不会的东西,而且只要你真的想做点什么,它一定可以给你回报。这里可能有人要疑惑了,写个操作系统有什么回报,也不是什么热门的方向(比起人工智能、区块链、5G、VR、AR这些),但是首要一点,它可以让你毕业啊,而且以后你完全可以把它写进你的简历中,绝对是加分项啊,毕竟其中含有的技术是很多的,对于理解Linux的帮助作用更是不必多说。综上所述,如果你半路放弃了,问题并不大,确实难;如果你坚持下去了,你的这个兴趣爱好绝对不会亏待你;如果你能点个赞,你的收入绝对超级加倍。

学习所需要的基础知识

一、熟练掌握C语言

因为ZOS就是用C语言写的,所以熟练掌握C语言的重要性不言而喻,但是熟练也是要有个度的,经过我的深思熟虑之后,对熟练程度有了一个大概的定义如下:

1.没有语法错误且格式规范。这个应该是对C语言的基本要求,这里的没有语法错误不是说写出来完全没错误,而是说有少量错误而且能通过错误信息定位并修改错误。格式规范就不必多说了,实在不行就用编辑器(vscode等)的自动格式化,一眨眼就完事,这个要求的用处可能在刚开始并不明显,但是当代码行数上千的时候就十分明显了。

2.熟练掌握指针的概念。首先要掌握数据指针,这其中包括基本类型变量、结构体、数组等,然后是函数指针,这个概念比较简单,如果不会直接百度就可以了,看一下写一下也就明白了。

3.熟练掌握数组、链表。对于数组这个怎么说呢,应该是会用就行吧,别的也没啥特别高的要求。对于链表需要掌握单链表和双链表的构建和遍历。

4.基本的调试能力。这个怎么说呢,实际调试过就可以了吧,更多的要求在gdb要求中说吧。

二、熟练掌握C程序编译过程

因为内核的链接是需要自定义链接脚本的,而且要混合C语言和AT&T汇编共同编译,所以要掌握C语言在gcc编译套件(其他编译器大同小异)下的预编译、编译、链接过程。对于这方面的知识其实有很多的博客可供学习,但是相关资料较多而且良莠不齐,所以后面在涉及到编译的知识时会给出几个比较好理解的博客或者我自己写一个以供参考。

三、熟练掌握AT&T汇编

对于汇编的选择其实有很多,比如nasm啥的,我选择AT&T的原因非常简单,因为gcc编译C源文件时是将C代码转换为AT&T汇编然后交给汇编编译器处理的,所以选择AT&T汇编就可以省不少事,直接用gcc工具套件就可以完成编译工作,而且对于以后内核的调试也有益处,可以直接看懂gcc编译后的汇编代码。这里的熟练程度就是说你知道AT&T汇编的基本语法就可以了,至于要学习哪些指令到时候用到了再说也不迟。

四、熟练掌握gdb和qemu的使用

这里的qemu是虚拟机,对于qemu的要求就是会面向搜索引擎使用就可以了,哪里不会搜哪里。gdb是调试用的,和qemu一样,首先你能通过搜索引擎使用gdb就可以了,然后这个就比较重要了,对于内核的调试是不同于用户程序的调试的,有那么一点调试的技巧,后面我会写一个在编写ZOS时所需的调试技巧的博客,对C语言调试、汇编语言调试和多进程调试有一个较为详细的介绍。

五、熟练掌握make和linux命令行的使用

make是方便编译、运行和调试的,在使用make的时候不可避免的要用到linux命令,对于这两者的要求就本上就是不用的不学,用到的就要学的透彻。

六、没了

应该是没有别的要求了吧,就算有以后再说吧。这里要提的一点是,假如你不满足上述任何一个要求或者干脆都不满足,你也可以学习编写内核,但是要对这条漫漫长路有个心理准备,虽然生活中尽是坎坷,但是这条路肯定比想象中要坎坷的多鸭。

ZOS的发展方向

项目地址https://gitee.com/zzhf/Zero-Operating-System

现在有两个分支,cooper分支是和室友合作写的毕业设计,这个分支作为毕业设计的纪念以后应该不会修改了,但是这个分支是可以正常运行的,可以说是一个完整的操作系统,如果有兴趣运行一下可以克隆这个分支。

主分支目前只有内存管理、中断管理和虚拟文件系统,只支持单核和768MB物理内存,并不完整。今后一段时间的工作主要就在主分支上,首先将已经完成的部分通过写博客的方式熟悉一下,接着将主分支补充完整,使之成为一个真正的32位单核操作系统内核并尽可能无缝编译运行linux的用户程序。

在单核内核完成之后会保存单核内核的分支,然后以一个新的分支开始将内核向多核发展,通过不断的学习使内核支持更多的设备,拥有更多的功能,向linux看齐,这将是一个永无止境的道路,祝愿我能坚持不懈吧。

写在后面

在此要感谢吉林大学、osdev、xv6、谷歌翻译、《30天自制操作系统》、《自己动手写操作系统》、《x86汇编语言:从实模式到保护模式》、《LINUX内核完全剖析:基于0.12内核》,《GRUB源代码分析》、《IA-32卷3:系统编程指南》、《FAT32文件系统详解》以及不计其数文章的作者,如果没有各位大佬的辛勤教导和艰苦奋斗,我想我早已放弃甚至根本就不会编写操作系统内核了,在此为弘扬各位大佬无私奉献和不懈奋斗的精神,特此编写这个系列的文章,为热爱编写操作系统却无从下手的小伙伴铺出一条道路,尤其是像我这样英语不行的,本系列文章将尽全力起到抛砖引玉的作用。

生命不息,BUG不止,今特此立下flag,我生命不息,则ZOS成长不止。

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值