HTML5技术

跟我一起写操作系统(一)——10分钟写个操作系统 - lucasysfeng

字号+ 作者:H5之家 来源:博客园 2015-09-30 11:00 我要评论( )

原创文章,转载注明出处: 想动手,但不知从何入手,是学习一门新知识普遍会遇到的尴尬点。笔者喜欢边实践边学习理论,笔者的写作思路是: 入门的文章要避免讲一些高深的理论,而应该先抛出demo,从研究demo入手,逐步加深demo的难度,从而学习这个过程中涉

  原创文章,转载注明出处:

 

  想动手,但不知从何入手,是学习一门新知识普遍会遇到的尴尬点。笔者喜欢边实践边学习理论,笔者的写作思路是:入门的文章要避免讲一些高深的理论,而应该先抛出demo,从研究demo入手,逐步加深demo的难度,从而学习这个过程中涉及到的理论知识。下面就让我们花10分钟写个“操作系统”。

第一节 开发环境

  我们在linux下制作软盘、编译内核等,因此需要linux开发环境。如果你用windows, 那么在windows下安装VMware, 在VMware中安装ubuntu虚拟机,此ubuntu作为开发环境。

  注:笔者的开发环境是windows--VMware--ubuntu14.04.

第二节 计算机启动过程

  写操作系统看似是一个复杂的过程,但只要我们将过程分解,完成每一步,那么完成一个操作系统就是水到渠成的事了。好了,我们就看一下计算机的启动过程,看操作系统何时被启动的。

  第一步:读取BIOS

  按下电源按钮后,计算机首先读取一块ROM芯片,这块芯片里的程序是"基本输入输出系統"(Basic Input/Output System),即BIOS.

  第二步:硬件自检 

  BIOS会检查计算机硬件是否满足运行条件,如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。

  第三步:启动顺序

  硬件检查完成后,BIOS会将控制权交给下一阶段的启动程序,注意,“下一阶段的启动程序”可能存放在硬盘中,也可能存放在CD/DVD中,或者软盘中等等,可以设置BIOS选择从哪个设备启动

  第四步:主引导记录

  BIOS找到了“下一阶段的启动程序”所在设备,会读取该设备的第一个扇区,即读取最前面的512字节,称为主引导记录。主引导记录会告诉计算机下一步到哪里去找操作系统。

  第五步:bootloader

  计算机读取"主引导记录"前面446字节的机器码之后,运行事先安装的“启动管理器”bootloader,由用户选择启动哪个操作系统。如果你安装了多个操作系统,那么就要从这步做出选择了。

  第六步:加载内核

  好了,选择操作系统(内核)后,会加载内核,下面就交给内核去处理了。

第三节 主引导记录

   我们使用虚拟机来启动操作系统,上面的第一步和第二步我们不做,由虚拟机去完成;第三步“启动顺序”我们选择从软盘启动(我们用镜像代替,并不是真的软盘),需要对虚拟机做下设置,选择从软盘启动。下面重点来看第四步,我们写一下“主引导记录”,让BIOS读取我们写的主引导记录。

   1. 主引导记录代码(不必深究,简单了解)

  文件名:boot.asm

org 07c00h     ; 告诉编译器加载到07c00h处 mov ax, cs mov ds, ax mov es, ax call DispStr ; 调用显示字符串函数 jmp $     ; 无限循环 DispStr: mov ax, BootMessge mov bp, ax mov cx, 16 mov ax, 01301h mov bx, 000ch mov dl, 0 int 10h ret BootMessge: db "hello, OS world!" times 510 - ($ - $$) db 0 dw 0aa55h  

  2. 编译

  注:如果没有NASM,安装它 sudo apt-get install nasm

  $ nasm boot.asm -o boot.bin

      执行完上述命令,会生成boot.bin文件,这就是我们的主引导记录二进制,上面的步骤可以用下图表示: 

第四节 制作软盘镜像,加入主引导记录  

  如何用dd命令制作软盘,自行google之。

  1. 首先,我们制作一个空的软盘镜像diska.img:  

    $ dd if=/dev/zero of=diska.img bs=512 count=2880

  2. 之后,我们制作一个包含boot.bin的镜像文件boot.img:

      $ dd if=boot.bin of=boot.img bs=512 count=1

  3. 然后,将diska.img中1个扇区后的数据拷贝到boot.img的后:

      $ dd if=diska.img of=boot.img skip=1 seek=1 bs=512 count=2879

  这样就做成了一个大小为1.44Mb的包含主引导记录的软盘镜像文件boot.img。

  4. 将虚拟机ubuntu中的文件boot.img拷贝到windows下(鼠标直接拖拽,如果不行google之)。

第五节 用软盘镜像boot.img启动一个空的虚拟机

  1. VMware创建空的虚拟机,去掉开机从CD/DVD启动选项。  

  2. 网络选择host-only模式。

  3. 选择从软盘驱动,路径选择上一节已经拷贝到windows下的镜像boot.img.

  4. 开启虚拟机电源,看到如下画面,恭喜你,成功了。

  好了,至此,我们完成了主引导记录,后续会介绍grub,即选择操作系统并载入内核,并进一步讨论进程管理、内存管理、文件系统和中断等等。

 

参考:

1.

2. 于渊. 一个操作系统的实现[M].电子工业出版社,2009年.

3. https://github.com/hurley25/hurlex-doc

4. 计算机是如何启动的, 

 

支持作者继续写

 

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 一起来玩echarts系列(二)------echarts图表自适应问题 - 谦一

    一起来玩echarts系列(二)------echarts图表自适应问题 - 谦一

    2017-01-14 09:04

  • 小公司的一年,一起看看小公司的前端可以怎么做 - 叶小钗

    小公司的一年,一起看看小公司的前端可以怎么做 - 叶小钗

    2017-01-01 09:00

  • 和transformjs一起摇摆 - 【当耐特】

    和transformjs一起摇摆 - 【当耐特】

    2016-12-01 18:00

  • 那些年我们一起过的JS闭包,作用域,this,让我们一起划上完美的句号。 - 追梦子

    那些年我们一起过的JS闭包,作用域,this,让我们一起划上完美的句号

    2016-08-19 18:00

网友点评
e