怎么做一个简单的操作系统

其实操作系统不是个clean problem,我个人是认为写编译器对学习、工作的帮助更大啦(大很大,比更大更大),并且更干净(比干净更干净)更好写(比好写更好写),当然不可否认操作系统看上去是挺高深莫测的。。(而且挺没用的。。。我认为主要原因是很多人没学好cpu原理,觉得底层的一切都那么神奇,并无限渲染放大「底层高手论」。。。学EE的同学,大部分不还是被坑了)

如果你执意要写操作系统的话。。。

我的建议如下:

学习、理解CPU,自己设计一个指令集,这个主要是让你明白计算机是怎么工作的,在没有OS的情况下如何使用。

你最好能对这个指令集写一个模拟器,写不出来,是因为你对理论和原理掌握不够。

如果你想要简单,可以采用stack-based模型,但是其实register-based模型用起来更方便也更熟悉。

学习OS其实不应该用x86这种工业品,太脏太杂,就算用也可以只用一个子集。所以如果上面自定义指令集的cpu模拟器你写出来后,就可以扔掉x86了。

如果你不扔,用x86也不必看什么保护模式之类的东西,脏自己的手。

——————————

一个简单的OS,应该由这三部分组成:

进程管理

内存管理

驱动程序

——进程管理——

理论知识不表,实践上,你应该实现这两个函数:_execute和_exit

而且你如果实现单进程OS,那就更简单了,多进程就是多点苦力活。

_execute用来开一个进程,做的事情是保存当前寄存器状态,设置新进程属性,然后让新进程开始执行。

_exit用来结束一个进程,做的事情是结束当前进程,恢复到上一个进程的状态。

状态保存在一块特殊的内存区域内,按照x86的做法,是用一个寄存器以stack的方式来管理那段内存,那个寄存器叫SP

——内存管理——

内存管理也是两个函数:_alloc和_free

内存管理其实也很简单,_alloc的时候,记下size和地址,放入一个链表中,_free的时候,遍历链表,把那一块相应的记录标示一下,这个理论知识也说过,最好用装箱问题那一套解法,但其实你就裸来就可以了。。。反正是简单操作系统,原理比算法重要得多。

这样管理内存足矣,再高级点的话,现在的OS都带有分页功能,这个理论上也写了,你照着看就是了,话说前几天还做梦梦到页面置换算法来着。。。这个算法在我梦中的形象是一根白萝卜片烤串。。。

——驱动程序——

显示设备:

现在的显示设备都是光栅(raster)技术,光栅其实就是像素点。。意思是屏幕由无数像素点组成。

用一段内存来当做显示设备的source,比如显示器是400*300的,不考虑颜色,就用一字节代表一个点,那就要开一块400*300的内存当显存,显示设备每帧通过对这块内存的扫描来实现显示功能。

你的显示设备驱动需要实现的函数也很简单,大致就是_drawPixel、_drawLine、_drawRectangle、_drawCharacter之类的。

这几个东西你可以看看我写的一个答案里面的例子

地址是能不能设计出一个终极傻瓜编程软件,让普通人可以完美编程? - 知乎用户的回答

当然那个例子还是太简单了,因为是伪光栅,实际上画线算法要麻烦一点,这个图形学的书上会有写,不过你搜点博客看看就好了,很简单,无非是套公式计算而已,没必要自己想。如果这样写的话用汉编没个把小时很难调试正确。。。还不如汇编。所以我的例子就用伪光栅了。。。

显示字符的方法是这样的,对于每个字符,你都要画一份字符的图片(最简单的就是一个m*n的像素图),然后_drawCharacter函数的实现是把这个字符的图片复制到显存中去(你想象一下,体会一下我说的脏是什么意思。。。。)

输入设备:

键盘,一段内存空间映射成按键,通过对这段内存的操作来实现输入。

当然还有文件系统啊鼠标啊什么的,但其实没有文件系统也没什么,本来硬盘就不是计算机的标配,鼠标更不是必须,而且鼠标要配合GUI或者字符GUI来用,那就更脏了,所以就这样吧。。简单操作系统嘛

你或许会觉得我说的东西很奇怪,和书上讲得不一样,但其实操作系统就这么回事,书上写得太深层太详细了,我不是说书写得不好,书很好,很理论,但是你看书的时候应该要学会看到它背后的意思。

书会告诉你这是什么,有什么用,甚至为什么要这样,但你要学会思考「如果不这样会怎样?」

好,现在你可以在这个操作系统上实现一个俄罗斯方块(其实贪食蛇更好实现,让我写俄罗斯方块不如杀了我。。。)来忽悠那帮老师了。

否则他们会问你:「这黑乎乎的就就算完事了?写的什么东西!」

不过这里还是真诚建议楼主,不要写操作系统,付出远大于回报,写编译器吧。

你还年轻,以后实在想写,再写不迟

时间: 2024-09-19 23:58:38

怎么做一个简单的操作系统的相关文章

如何做一个简单的小网站

如何做一个简单的小网站,请注意:拥有域名不代表你就有了网站.做之前要想一下,网站用来干什么?静态的还是动态的,自己至少要懂一点代码知识,不懂程序的话,也要对html多少了解一些. 不然,我建议你还是到各大网站申请个Blog写日志算了:) 如果你: 1.做个简历式的小网站 上面就放些文章,图片或者资料,且文件不多,那么选择静态空间就搞定.你可以自己或者找人来做个网页的模版,自己套内容就 可以. 整体下来只要99元,包括域名和空间.在http://www.nicenic.com/design/?s=

源码-用javaSSH框架做一个简单的登录功能

问题描述 用javaSSH框架做一个简单的登录功能 用SSH框架做一个简单的登录功能,登录成功则跳转到一个页面,登录失败则跳转到一个失败页面,MySQL数据库.求大神指点,最好能提供源码 解决方案 Spring 3.x 企业应用开发实战的第一个例子就符合你的要求了.Mysql+srping3 解决方案二: 告诉我你的扣扣邮箱,我发你邮箱 解决方案三: 主要还是在struts2 里面,处理业务逻辑,再跳转到指定页面,关键在struts,xml配置文件里面

用php做一个简单的表单

PHP最有用的特性之一是它能够自动将表单中的变量值赋予PHP变量.这使得表单处理变得非常快捷. 因此,如果你送出一个内含输入栏位值的表单如下: <INPUT TYPE=TEXT NAME="name" VALUE="Glen Morris"> 当你用PHP处理此页面,$name变量的值就会是 Glen Morris. 因此,你可以用如下的方式把值打印出来: echo "Hi $name!"; 或者像这样测试其值: if ($name

静态网页-求大哥们帮做一个简单的购物网页。

问题描述 求大哥们帮做一个简单的购物网页. 小弟本人是IT新手加菜鸟,刚上大一,这学期初学习了HTML静态网页制作,现在有道结课作业,要求如下: 至少应该有主页.注册登陆页面及其他商品介绍的页面.主页要求有导航栏区.登陆注册区.以及其他主题功能图片预览区:主页命名为index.html; 3. 完成注册.登陆功能,网站主页使用合理的框架结构: 4. 用户的注册功能利用表单来完成,注册用户登陆后可以上传本地其他图片到某某文件夹中: 5. 网站中的其他页面和功能可以根据自己能力水平进行其他方面设计,

java web新闻管理系统-谁用java web做一个简单的新闻管理系统啊,急用!!!

问题描述 谁用java web做一个简单的新闻管理系统啊,急用!!! 增删改,分页,有前台和后台.后台就是管理员的增删改,前台就是显示新闻的标题和内容.用oracle数据库链接.有的请发在我邮箱825091682@qq.com.谢谢了 解决方案 smarty实现简单的新闻管理系统smarty实现简单新闻管理系统 解决方案二: 不用框架,仅用java web

string-在vs2013用MFC做一个简单的视图

问题描述 在vs2013用MFC做一个简单的视图 解决方案 CString对象需要显示的创建 解决方案二: 注意字符类型 pDC->TextOutW(10 10 L""ONE WORLD ONE DREAM""); 解决方案三: 一般这样写pDC->TextOut(10 10 _T(""ONE WORLD ONE DREAM""));

asp.net mvc项目:做一个简单的购物网站,如何实现让多个用户同时在线购物?

问题描述 asp.net mvc项目:做一个简单的购物网站,如何实现让多个用户同时在线购物? 请知道的同行具体给晚辈吐槽点经验知识(asp.net mvc项目:做一个简单的购物网站,如何实现让多个用户同时在线购物?) 解决方案 每个用户的信息放在session里面,互不干扰的.在数据库中,通过用户id区分不同的用户,所以做网站天然就可以支持多个用户在线购物. 微软专门做了一个asp.net mvc的例子,叫mvcmusicstore,是一个音乐购物网站,你可以google下,有关于它全部的源代码

[Qt Topic] – 二维绘图研习,做一个简单批量水印工具

[Qt Topic] – 二维绘图研习,做一个简单批量水印工具 作者:Jason Lee 日期:2010-05-02 平台:Qt SDK v2010.02.1 + Windows Xp 声明:文章作者仅在Intel软件网络和CSDN博客发表本文,如有转载,请注明出处   [1]二维绘图概览 Qt中的二维绘图是基于QPainter.QPaintEngine和QPaintDevice机制的:以QPaintEngine作为中间接口,使用QPainter在不同绘图设备上进行绘图操作,而QPaintDev

线程-我想做一个简单的抽签 用windows from 做对txt读写

问题描述 我想做一个简单的抽签 用windows from 做对txt读写 求windows from线程步骤 求windowsfrom 对txt文档读写步骤 非常感谢 解决方案 非常感谢 解决方案二: http://blog.csdn.net/xianfajushi/article/details/7498079