为什么80%的码农都做不了架构师?>>>
首先个人文笔有限,并不是专业写文章的人,同时知识面也比较局限,以下只是个人对这个问题,在日常闲余时间去对这个问题进行的一些探索总结,如有疏漏不足望客官海涵。这是系列文章,后续我会持续记录。好现在来聊聊这个问题。
如何开发一个全新的操作系统呢?这个是很大的问题,很多人在很多时候都会想到这个问题。
前段时间我又想到这个问题,同时在网络上进行初步查找资料,以期望来得到这个问题的答案。在查找过程中,首先找到的不是如何开发的具体思路与方法,而是为什么做一款操作系统那么难?这个文章在开源中国也有,有兴趣的朋友可以看看。我对这个文章的总结理解就是做一款操作系统非常耗钱,如果不能商业化,就算做出来也是活不来的。就文章里的观点我就不评论了,有没有必要再去开发一个全新系统也不讨论了,当然做系统难肯定是难的,而一直以来能让我们可以做选择的,无非就是做与不做的选择。如果我们选择就为了个人乐趣做一个操作系统呢,可行吗?在我看来没有答案,只有做了才知道。当然很多人会说一个人是做不了这个事,需要团队,这一点我也不否认。
好回到主题,那么如果要开发一个操作系统要如何做呢,首先我整理了一下现有成熟操作系统派系,Windows、Unix,其他或许还有但是大多数人估计听都没听过,就不特意去深入叙述了。Windows PC机的王者、Unix派系的系统就五花八门了,比如苹果的Mac OS X 、 iOS啊,知名的Linux啊,以及基于Linux衍生各类系统,移动端知名的就是安卓系统。这个话题衍生下去内容也很多,这也不是我们要关注的点。因此只是有个大概的了解就可以了。这些系统都是如何开发的呢,或者简单点问是用什么语言开发的,在网络找到最多的答案是C语言+汇编语言。我们姑且相信这是真实的答案。那么有了这个答案后,后面就有新的问题,有了语言用什么工具呢,有了工具如何调试呢?带这这个问题我开始新的探索之路。
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。这个是百度百科里的介绍,同时下面有给我们整理了对应的编译器、集成开发环境。
编译器
GCC,GNU组织开发的开源免费的编译器
MinGW,Windows操作系统下的GCC
Clang,开源的BSD协议的基于LLVM的编译器
Visual C++ :: cl.exe,Microsoft VC++自带的编译器
集成开发环境
CodeBlocks,开源免费的C/C++ IDE
CodeLite,开源、跨平台的C/C++集成开发环境
Orwell Dev-C++,可移植的C/C++IDE
C-Free
Light Table
Visual Studio系列
那么有这些,我们是不是先要学会C语言跟这些工具呢,然后就可以开始开发系统了?当然不是,首先我们要理解什么叫操作系统。这方面的资料又是海量的,需要大量的时间去了解,但是我在这里归结两个点,第一个点操作系统是一个集合体,是有很多子程序组合而成的。第二点目前的操作系统都是可以兼容很多不同的硬件环境。为什么只提这两个点呢,因为通过这两个点可以帮助我们判断很多事情。第一件最重要的事,我们要开发一个怎么样的操作系统,是大而全,还是小而美的系统,大而全自然工程量会几何性的增长。第二件事就是既然操作系统是集合体,我们能不能先开始搭建最重要的子程序,先搭建一个框架的问题。目前手机成为了生活息息相关的必须品,未来还有各种智能设备会出现在人们的生活中,目前这些设备都基于Linux系统去开发的居多,比如:OpenWrt项目。题外话:同时我也搜索到另外一篇文章叫 为什么谷歌会从零开始构建一个全新的操作系统?,同时我也搜索了下国产操作系统发展,得到大多就是 以Linux 为基础二次开发的操作系统。同时得到一个有趣的现象就是公司倒闭了,所有的努力过的东西就这样随风而去,没有留下可以让其他人可以追寻的脚印,让更多的国人对如何开发一个操作系统更多只停留在想象上,无从入手。
基于上面两个总结,以及自身的能力做出判断是,想朝开发操作系统踏出第一步,需要先想好做一个怎么样的操作系统。未来最火热的是什么,手机?好就手机,当然我们做的系统最好也能在这些小设备上、比如路由器啊、智能音响、家庭投影啊等上面运行,未来物联网是趋势,终极目标是可以在手机上运行。好现在目标有了,我们来分解下难度,首先就目前安卓手机配置五花八门,连安卓也是需要厂商自行适配调整,而它的对手苹果就纯粹得多,只支持自家定制的配置。而回到我们自己这里,那么我们不可能一开始就制作一个兼容性很高的操作系统,我们要先尝试做一个就支持固定配置,然后预留拓展功能的系统。方向目标都有了,那就到了如何去实现上了。
上面我们去了解了操作系统的原理啊,发展史啊 等等信息,归结到底在与硬件与语言的配合,这里就有个新问题,我们也使用C语言和汇编语言吗?这两种语言已经很古老的语言,但是目前底层还是使用这两种语言开发,同时我们如果使用C语言跟汇编语言,这是站在巨人的肩膀上啊,毕竟这两种语言是经历过岁月沧桑论证的,用不用呢,我的选择不用,因为我们本身就是来尝试一个新事物的。能改变的就去试试改变,或许改着改着就有新的变化呢。
那么如果创造一门语言呢,这又是一个大话题,网络上有句玩笑就是编程语言很多时候就是某个无聊的牛人在某个圣诞节的半夜闲得无聊折腾出来的,因此我继续我的探索之旅,看看编程语言相关知识,编程语言分为大致是命令式语言、函数式语言、逻辑语言和面向对象的语言(实际上还有很多不同的划分版本),那么C语言属于什么呢,就我看来 C语言属于命令式语言也可以称为过程式语言,通俗点理解就是,比如把大象放进冰箱分几步,这个过程的实现在C语言上面体现就按照步骤一个步骤一条多条语句来实现一整件事,按顺序来写,而汇编语言呢 ?汇编语言 属于 符号语言,什么是符号语言呢 ,这个要先说起计算机基础知识,机器语言,机器语言是谁能理解的呢,CPU,简单点说就是我们给CPU下个指令 。这个指令是一串二进制码类似这样1000100111011000 机器指令 而这些二进制码 是谁定义的呢,CPU生产商吗,是也不是,因为CPU 又分阵营 也有理念冲突,也有需求冲突的,因为这些冲突大致分成两个派系CISC(复杂指令集) 、RISC(精简指令集计算机) 具体的知识点就不展开细说了,我们只关心我们自己的,我们的目标需要用到的是RISC(精简指令集计算机),因为市面上的手机大多数都是用这个指令集的CPU ,而汇编语言就是例如mov ax,bx 等汇编指令,通过汇编的翻译器会转换成一条条的机器指令然后让CPU来执行,首先我不知道现在那些开发系统的牛人们还在使用汇编语言不,还是已经把汇编语言整合进新的开发语言里进去了,这个不得而知,反正我就知道汇编就干了这个活就好了。
好两种基础语言了解完了,我们来了解下跟我们有关系的东西,那就是CPU指令集,既然要做当然要做支持最新的指令集是最好的,因为本身我们没有实力去生产CPU,这个是我们个人力量无法去改变的东西,好我们里来看看我们的手机,苹果手机CPU ,哇塞自己设计让人代工生产,好吧我们搞不了,里面指令集怎么样的我们更无所得知,这路走不通了,那我们来看看安卓手机,小米、OPPO、VIVO、华为比较常见,一看手机CPU, 两种居多,高通、联科发。再来看看这两家公司最新CPU上用的是什么最新指令集呢,一家牛逼的公司映入眼前:英国Acorn有限公司 简称 ARM,然后到官网找找最新指令集ARMV8指令集,还分ARMV8-A、ARMV8-R、ARMV8-M,后面的先不管,我们就认准了ARMV8-A指令集。好了他们的CPU 就认这个指令集里的指令。等于我们首先要去学习这个指令集,否则后面啥也做不了。
好些的问题出现了,如果学习ARMV8指令集呢,光靠看书肯定不行,需要实践调试,那么如何调试呢。这个就涉及到新的领域,ARM开发板的知识面,那么第一个想法是能不能把身边的手机啊、路由器拿来调试呢,答案是可以,但是先别高兴,前提是你有对应的设备的一些资料,没有对应的硬件资料,还是行不通的。于其去研究这些设备硬件,不如想找找有没有提供这些资料的开发板类似的东西卖。那要买个怎么样的开发板才适合我们目前的状态使用呢,这个又要先了解下这些硬件是怎么样植入系统的,或者说刷入系统的,就我目前找到资料显示,一般性的手机也好,其他小设备也好,本身在没有系统的时候,内部先有一个bootloader,类似PC机子上的BIOS,是最底层的引导软件,一般都是由硬件生产商写入的,简单的说,bootloader就是在操作系统内核运行前就运行的一段小程序。这段小程序可以初始化必要的硬件设备,将系统的软硬件环境带到一个合适的状态,并从外部存储器或通过网络等通信方式加载内核,创建内核需要的一些信息并将这些信息通过相关机制传递
给内核,最终调用操作系统内核。因此我们需要买一个开源bootloader的,支持最新ARMV8-A指令集、相关其他资料也公开的开发板。市面上有没有,我正在找,同时也在找这方面行业的朋友。如果你是从事这行业的可以评论留言给我。谢谢
目前探索到这一步,同时附带购买了一些书籍来补充对应一些点上的知识,比如汇编语言是如何设计的等等为后续做准备,后面有新的进展,再来文记录。
2018年11月02日 中国义乌 随笔