{eval=Array;=+count(Array);}

问答专栏Q & A COLUMN

我想写一个自己的操作系统,比如Unix或Linux,最起码我需要具备些什么?然后我需要怎么做?

周国辉周国辉 回答0 收藏1
收藏问题

10条回答

lncwwn

lncwwn

回答于2022-06-27 17:20

Unix和Linux属于大型操作系统,凭个人之力,根本不可能完成。以Linux系统为例,它的版权人林纳斯.托瓦兹(Linux之父)是个天才程序员,没日没夜忙了差不多半年,写出Linux的0.01版,也就是初级版本,你猜源代码有多少?大概有1万行。

Linux0.01版发布后,林纳斯和全球成千上万黑客(和现在喜欢在网上偷鸡摸狗的黑客不同,那时的黑客都是程序员大牛,主要以改进电脑软硬件性能为乐趣)一起修改完善。从1991年0.01版发布,到1994年Linux1.0正式版发布,三年时间,参与的程序员能轻松坐满一个足球场,你猜代码有多少行?一共17万多行。

林纳斯.托瓦兹(Linus Torvalds),Linux系统之父。你的手机、你家的电视机顶盒、你常取款的 ATM上的系统,都是基于 Linux 系统改造而来,没有这个人,就不会有现在的开源软件。



除非你认为自己的编程天赋和勤奋努力程度能碾压上述大牛,那么可以试试以个人之力,写一个Linux级别的操作系统。

更重要的是,当时还是486电脑当道的时代,操作系统远没有今天复杂,那怕是iOS和安卓这样的公司化运作的操作系统项目,也并没有从0写起,而是“踩在前人的肩膀上爬梯子”,iOS的内核是Unix,安卓系统的内核是Linux,苹果公司和谷歌公司在原有系统上“改扩建”,搞成了自己的东西。

肯·汤普森(Kenneth Thompson),C语言前身B语言的作者,Unix的发明人之一,程序员们的祖师爷。



当然,如果不是要写Linux这样的大型操作系统,就是想写来玩玩,比如搞个mini的,还是有可操作性的:

  1. 建议从最基础的玩起,先写监控程序(操作系统的原型),仅具有加载程序和运行程序的功能。
  2. 监控程序玩熟练之后,可以写用于单片机的微型操作系统,包含控制程序、编译器和简单的应用程序。

个人要熟练写操作系统,大致说来需要具备下列素质:

  1. 熟练运用C语言编程;
  2. 会汇编语言;
  3. 了解基本的硬件知识;
  4. 会写硬件驱动程序;
  5. 会软件架构设计;

不过,上面这些都精通了,随便去互联网大厂拿个七八十万年薪的offer是分分钟的事,何苦自己折腾!

评论0 赞同0
  •  加载中...
mushang

mushang

回答于2022-06-27 17:20

也不是泼冷水,不同的操作系统有不同的应用领域,它是一个复杂的系统工程,只靠一个人的能力是无法实现的,精力能力都有限,需要掌握硬件,软件的知识非常广,例如,工程,通信,网络,个人等等,至今为止没有一个操作系统是一个人来完成的,也许你会破例。

评论0 赞同0
  •  加载中...
smartlion

smartlion

回答于2022-06-27 17:20

不请自来。

要写操作系统,你需要的是大量基础知识,比如操作系统原理、保护模式、计算机组成原理、处理器架构、汇编语言、链接与装载等等。

具体怎么BOOT启动,怎么跳20号地址线,怎么切换到保护模式之类就不说了,你需要对操作系统有个全面的架构设计,中断怎么响应,进程/线程怎么调度,内存怎么管理……,慢慢地,你会搞出一个操作系统雏形出来了,当然这里是指内核。

等到这差不多了,重头戏来了,你要开发一些驱动程序,没错,那些硬件厂商可不会随便为新的操作系统开发驱动的(或者适配)。什么显卡驱动,什么文件系统(当然是创新的,不是NTFS,也不是EXT4之类),什么网卡驱动……又要拜托你开发了。

好了,经过多年不懈努力,假设你终于完成驱动层了。

系统也跑起来没蓝屏了(假设内核吐核时有蓝屏)。

好的,重头戏又来了,你这个操作系统还没有一个应用软件。比如上面没有Photoshop,没有Chrome,没有QQ……没有任何软件啊,这可怎么办呢?那些软件厂商可不会随便为新的操作系统开发软件的(或者适配),咦,这句话好熟悉的感觉。

对了,这就是所谓的操作系统的“生态”系统,现在,已经不是编程能力的问题了,你面对的,是海量的生态。

评论0 赞同0
  •  加载中...
gaara

gaara

回答于2022-06-27 17:20

能问这个问题,就代表你就写不出来了,不是打击你,建议放弃,浪费时间,你先看懂了Linux 内核早期版的源代码后(网上有下载)再谈这个话题。

评论0 赞同0
  •  加载中...
Jeffrrey

Jeffrrey

回答于2022-06-27 17:20

其实没那么复杂,我自己就写过一款Rtos,简单实现任务调度,任务间的通信,全部大概5000行代码,操作系统现在分为微内核和巨内核,像Linux实现了用户区和内核区隔开,内存机制需要Mmu支持,就非常复杂,想鸿蒙就实现了微内核,就做操作系统而言并不像外面人认为那样门槛高,熟悉普遍的操作系统的一些机制就可

评论0 赞同0
  •  加载中...
defcon

defcon

回答于2022-06-27 17:20

大家好,我是十年linux程序员,我认为:操作系统,说大可大,说小可小。

往大了说,一个操作系统并不单单是一个操作系统,而是一个生态。在这个生态的后面,包含了芯片生产产商、底层内核软件提供者、还有各大发行版软件公司。这些公司构成了一个完整的生态,在不同的层面上支持了操作系统的健康、稳定的向前发展。

但是往小了说,操作系统也没有那么神秘,因为它就是一个具有特权模式的应用程序。linux最新的源码因为加入了太多体系兼容的代码,比较复杂,所以,不太容易看的出来。但是如果真想自己写一个操作系统,可以参考linux0.11内核或者ucosII。

linux0.11内核是linux的创始版本,里面都是linux的核心,而没有太多的驱动架构、KVM等非核心功能。所以,更适合研究、学习和模仿;而ucosII则更加精简,只有几十K,但是却具备了一个操作系统的所有功能,ucosII的内核体系结构如下:


结合以上来看,如果要实现一个简单的操作系统,需要:

  1. 实现中断部分,中断是系统的核心,时钟的产生需要中断,而时钟
  2. 实现时钟部分,时钟是操作系统的心脏和脉搏。人无心脏则怠,操作系统无时钟则运不转;
  3. 实现内存管理部分,这样程序才有了运行的载体。
  4. 进程调度器,这是应用程序运行的基础
  5. 存储+文件系统
  6. (可选)外设驱动架构,如果你的操作系统要支持各种各样的外设,那么可能要为不同类型的外设编写不同的驱动架构或者模型,这个部分非核心功能,所以是可选的。

以上这些功能都是操作系统的必要组成部分,如果要自己写一个操作系统,则至少要实现以上这些部分。坦白来讲,这个任务一点都不简单,你需要具备的知识:

  • 汇编知识(x86汇编和arm汇编不同)
  • 处理器体系架构知识(不同处理器,对中断等的实现是不同的)
  • 精通C语言(基于效率考虑,操作系统几乎全部都是C写的)
  • 精通操作系统知识,此处细节繁多,可参考任何一本关于操作系统原理的书籍

总之,自己写一个操作系统挑战是很大的,如果是基于学习的目的去写一个操作系统,我认为是值得鼓励的;但是如果是基于商业的考虑去自己写一个操作系统,那么我认为是没有意义的。

欢迎关注"技术简说",带你由浅入深、一步一步学习linux内核源码。

评论0 赞同0
  •  加载中...
NicolasHe

NicolasHe

回答于2022-06-27 17:20

首先你要活一百年,为什么这么说呢?我告诉你吧,windos系统一共有1亿行代码,而且还是全球5万开发人员花了5年才写出来的,如果你一个人想写出这样的系统至少需要100年的时间,而且你还得24小时不休息,这点你能做到吗?

不过你想学习相关编程技术我建议你可以先学Java或者是C语言今后会对你职业生涯有帮助。

评论0 赞同0
  •  加载中...
liaoyg8023

liaoyg8023

回答于2022-06-27 17:20

想要写一个操作系统的人大部分都是带着兴趣玩,毕竟现在主流的操作系统windows,苹果系统,linux系统属于目前比较常见的系统,其中linux内核属于开源可以看到其全部的代码,很多研究操作系统都是以linux为参考的模型,毕竟开源的代码研究起来也方便,但是对于个人来讲要去写一个操作系统难度可想而知了,曾经有个北京的同事已经工作了十几年主要的精力就是在研究底层,是个疯狂的linux内核研究者只要是是家里没事就会呆在公司加班研究linux内核,有时候一起吃饭讨论研究linux内核的主要在哪块,他讲到其实linux内核已经不是当初设计的样子了,现在的代码的更新速度之快让人发指,在全球范围内真正对于核心内核代码具备修改能力的非常有限,而且已经被国外巨头公司收到自己的公司作为储备资源。

说到linux内核非常的关键代码就是内存管理,这块也是linux内核非常关键的代码,每次和同事一起讲到内存管理他就会两眼放光,曾经有一次公司组织让他给大家讲下linux内核的内存管理,结果一口气讲了3个小时中间没有任何的停歇,讲的大家都快睡着了他还在激情澎湃在讲着,说到内存管理他能一口气讲3天3夜,说到linux代码的贡献者,大部分可能是对一些驱动细节或者测试用例的提交,这些本身的技术含量不是很大但是需要遵守里面的代码规范,一旦不规范连基本的机器检测都通过不了,虽然看起来是开源的社区对于代码规范要求也是极其严格的。

说到每次研究linux内核的心得,最大的快乐在于看懂一行里面核心代码的设计意图,能够看懂linux核心代码的为什么要这么实现就已经代表水平非常不错的人了,倒不是linux内核代码有多深奥,关键需要对于内核的工作原理以及常见的知识有足量的储备,当然如果长期跟踪代码实现的规律可能研究起来就比较顺畅了,如果短时间内想彻底的看明白还是存在非常大的难度的,所以想要研究一个linux内核的代码,建议现在linux内核社区浸泡一段时间,然后了解周围的基本知识,当然首先要具备一定程度的编程能力。

对于操作系统来讲本质还是一个软件产品,但是又有其特殊性属于给别的软件产品提供开发的环境,所以对于硬件资源支配以及用户的行为最贴近的软件系统了,由于用户体验极强所以其开发语言需要在性能上极强,操作系统主要的开发语言有C语言和汇编语言,很多人在网络上喊着C语言已经过时了,这些都是只看到表面的现象,只不过底层的语言不像之前显得那么重要了,但是很多软件系统的底层还是离不开C语言,而且像操作系统这么繁杂的工程C语言也是主力军,可以预见在未来C语言在应用级别的开发在减少,但是对于底层的维护能力还是在加强,大家都跑去开发高级语言了,总得需要有人来维护底层的而且对于维护和修改能力还是非常高,真正掌握高技巧的C语言能力的人还是照样在编程市场拿高薪。

由于操作系统功能太过复杂所以真要想要玩转linux内核建议看一本《linux内核完全剖析基于0.12内核》的书籍,专门抽取了早期的linux内核的版本在逐行讲解的一本书,里面详细的介绍了linux内核主要功能是如何实现的,以及为什么要这么去实现,但是由于历史太过久远不要企图和现在的linux内核做对比,中间优化迭代的版本太多了多的会让你怀疑人生,所以不要企图去了解其中的来龙去脉,还是先从基本的原理入手去解决,对于linux内核需要掌握的知识先从基本的编程语言和常见的操作系统运行的原理开始着手准备,希望能帮到你。

评论0 赞同0
  •  加载中...
Developer

Developer

回答于2022-06-27 17:20

看这两本书,一本《操作系统:原理与精髓》,另一本《操作系统:设计与实现》。后一本附minix 操作系统源代码。

评论0 赞同0
  •  加载中...
vpants

vpants

回答于2022-06-27 17:20

你唯一要做的就是:睡觉。

在睡梦中,也许你能出来个DreamUnix操作系统。

然后,一炮走红!

然后,我们天天在你的操作系统里梦游!


评论0 赞同0
  •  加载中...

最新活动

您已邀请0人回答 查看邀请

我的邀请列表

  • 擅长该话题
  • 回答过该话题
  • 我关注的人
向帮助了您的网友说句感谢的话吧!
付费偷看金额在0.1-10元之间
<