Norlit OS —— 自制操作系统 第0章 热身运动

来源:互联网 发布:广工数据挖掘2016 编辑:程序博客网 时间:2024/05/17 02:52

0  热身运动

0.1         前言

开发操作系统是很多程序员的终极梦想,但是很多人认为这是不可能的,其实,只要有爱,什么事都能办到(但超能力这种事情的话估计只有学园都市[1]了吧)。

操作系统的编写的确是不容易的,但是一步一个脚印,终究会换来成功。

什么操作系统是天方夜谭啊等等说法,其实是错误的。我们凭一己之力,虽然不一定做得出Windows这种动辄几GB的操作系统,也不一定能像Linux那样跨多平台,甚至不支持网络、音频设备,但是一定能有自己的用武之地,正如天生我才必有用

我们的操作系统只求精简易用,而不求庞大复杂,毕竟我编写操作系统也是为了学习。好了,废话不多说(其实你还在讲呢),现在动工吧!

 

0.2         什么是操作系统

既然是编写操作系统,那必然需要先知道什么是操作系统。

虽然大家每天接触操作系统,但是很少有人能够给出个恰当的定义。操作系统(Operating System),是管理计算机硬件资源,控制其他程序运行并为用户提供交互操作界面的系统软件的集合。操作系统是计算机系统的关键组成部分,负责管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本任务。

操作系统的种类很多,各种设备安装的操作系统可从简单到复杂,可从手机的嵌入式操作系统到超级计算机的大型操作系统。目前流行的计算机作系统主要有LinuxMacOS XWindows等,除了Windows等少数操作系统,大部分操作系统都为类Unix[2]操作系统。

历史上,还有MS-DOS这种古老的操作系统。但这种操作系统不具备现代操作系统的很多优点。我们既然做了,何不做好呢,是吧。

 

0.3         开发操作系统的语言选择

         我们首先必须选择我们使用的语言。我的选择很简单,汇编和C语言搞定一切。为这么使用这两种语言是有原因的,首先,我们是要与机器打交道,操作系统与平台架构直接相关,汇编是必须的。其次,太高级的语言会封装非常多的东西,不仅增加文件大小而且还会影响性能。所以,本书要求读者有汇编和C语言基础。

         另外,需要注意的是,我们开发的系统基于X86/64[3],苹果电脑[4]的各位只能使用虚拟机来开发书中所讲的一切了,看,谁说苹果电脑好了(笑)。

 

0.4         开发环境

我们使用GCC[5]NASM[6]来编译我们的操作系统。因此,我们需要首先配置我们的开发环境。对了,还需要一个虚拟机用来调试和运行。我们可以选择Bochs[7]作为调试的虚拟机。我们还需要安装的是一个快速的虚拟机来执行我们的操作系统。对于这种虚拟机,我们可以用QEMUVMwareVirtual PC或者Hyper-V

现在我们知道哪些工具是必要的了,那我们一起动手安装吧。

对于Linux用户,只要使用方便的apt-get工具即可,在终端中输入

sudo apt-getinstall build-essential nasm vgabios bochs bochs-x bximage qemu qemu-system

这里的build-essential包括了makegcc,所以回车就可以安装所有上述的工具及QEMU

         Windows下就稍微麻烦了一点,你没法输入命令安装了,只能怪微软不给力了吧(笑)。要注意的是GCC是在Linux下的软件,所以你必须安装一个Linux模拟器,比如Cygwin

0.4.1  Cygwin下的bash

在安装Cygwin时,记得选择安装nasm, gccmake是会自动安装的(如果不装nasm就是上图一样的下场哦,笑),所以最好将Devel目录的全部安装。然后你需要下载安装Bochs以及一个速度较快的虚拟机用于调试。对了,如果要使用64位的话,不要忘记安装Cygwin中的mingw64开发工具。

         对了,最后别忘了准备自己喜欢的源代码编辑器,Linux下可以使用gedit[8]Windows下笔者推荐使用Notepad++,它支持极大多数语法高亮。当然,如果你喜欢用VisualStudio或者记事本,那也是没问题的。

 

0.5         工具的使用

0.5.1  Bochs的启动界面

Bochs的使用曾经非常复杂,不过现在(如上图),已经支持GUI化的配置了,简单易用,不用再写什么配置文件了,万岁!Bochs不仅有强大的模拟能力,而且还支持调试,在命令行窗口你甚至可以看见一些重要指令的执行状况以及出错在哪里。所以,Bochs在手,天下我有!

另外一个重要的内容是Make的使用。MakeGNU开发的用于快速编译源代码的工具,你可以理解为批处理。关于Make的使用,笔者不想多讲,因为Make的语法够讲一本书呢。但是如果MakefileMake工具的文件格式)发生重大变化时笔者会贴上来的。

##################################

# Makefile for Norlit OS #

##################################

# Commands and flags

ASM    =nasm

ASMFLAGS   =

# Booter

BOOTER     =boot/boot.bin

# All Phony Targets

.PHONY : everythingfinal clean realclean all image

# Default starting position

everything :$(BOOTER)

all : realclean everything

final : all clean

clean :

rm -f$(BOOTER)

realclean :

rm -f$(BOOTER)

image: everything

    cp boot/boot.bin nl.img

 

$(BOOTER): boot/boot.asm

$(ASM)$(ASMFLAGS) -o $@ $<

代码0.5.1仅包含引导扇区的Makefile(chapter1/a/Makefile)

 

上面的代码即为仅包含引导扇区编译代码的Makefile,很复杂吧[9]?其实主要的就是赋值语句(请准许我这么叫)和标签(请允许我这么叫)。上面蓝色的表示变量的取值(如BOOTER=boot/boot.bin),之后可以用$(变量名)来引用这个变量。后面加冒号变量名(如everything)的表示子程序。如果文件名后加冒号(如$(BOOTER):)那么下一行表示需要该文件时的做法,后面的文件名表示该文件需要的文件(boot/boot.asm)。容我叽里呱啦就此带过,毕竟我不是研究Makefile的。如果感兴趣的读者可以去自己百度一下(Google it)来学习一下。

对了,我的Makefile是基于我的Windows开发环境的,Linux下的读者只能自己改一下了,对不住了。我将Cygwin提取了一部分,并加以64位支持,放在tools文件夹内,读者可以自行拿去用。注意,gcc默认为64位,大家最好加上-m32-m64显示指定编译位数。

        关于虚拟机的话题,我在此假设大家已经会用了,如果不会的话(比如说你听了我的谗言下载了QEMU的话),那就只能Google it了(笑)。(必应表示不公平!)

        其实QEMU的使用很简单,如果软盘镜像名为nl.img,只要

Qemu –fdanl.img

        就可以从nl.img启动了。至于VMwareVirtual PC这种大众级别虚拟机,就靠读者自己去捉摸了。

        顺便一提,上面的Makefile的语法高亮是Notepad++的功能,很不错吧。

        接下来的过程中,我将会使用Windows+Cygwin来进行整个程序的开发,在这里提一下以免引起不必要的误会。不过,Linux下的朋友不用担心,毕竟Cygwin就是Windows下的模拟Linux嘛。



[1]地名,出自镰池和马的轻小说《魔法禁书目录》,主要特色是培养超能力者。

[2]包括LinuxMac OS XMinix等,以及手机上的AndroidiOS

[3]大部分的内容与X86有关,但也会对64位架构有所涉及

[4]这里指的是非Intel处理器的苹果电脑

[5] The GNU Compiler Collection, 最常用的编译器之一,自由软件,详见官方网站gcc.gnu.org

[6] The Netwide Assembler, 著名汇编器之一,使用方便的语法,自由软件,详见官方网站www.nasm.us

[7] X86 PC模拟器,以跨平台著称,完全模拟计算机底层架构,不同于一般虚拟机软件。自由软件,详见官方网站sourceforge.net/projects/bochs/。在之后的内容中会介绍Bochs的用法。

[8]同下面的“Notepad++”都是著名文本编辑器,支持语法高亮,详见projects.gnome.org/geditnotepad-plus-plus.org

[9]当然这段话只是为不懂得Makefile的初学者准备的,如果你已经会了,请跳过这段。

原创粉丝点击