开发操作系统(2)
开发OS的第二天
&学习Makefile
编写NAS汇编文件
这里附件给的源文件已经是纯粹的汇编代码+数据组成了。
1 | ; hello-os |
这里有些知识点需要注意一下
ORG
汇编指令指明程序装载的地址,整个地址是有讲究的,因为我们现在是 OS 开发者,我们必须规划整个内存,不能跟 BIOS 抢了内存。0x7c00
这个地址是我们最低可用的内存,因此我们的操作系统加载在这里。我们把地址 0x00007c00~0x00007dff
作为我们启动区的地址。
在屏幕上打印文字需要使用中断去调用显卡的函数,这里我们把寄存器设为这些状态即可:
- AH:0x0e
- AL:ch
- BH:0
- BL:color
然后进入中断的方法为 int 0x10
Makefile编写
先从网上的资料上拷贝一些 Makefile 的基本信息下来。
什么是 Makefile ?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员, Makefile 还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写 Makefile 了,会不会写 Makefile ,从一个侧面说明了一个人是否具备完成大型工程的能力。
因为, Makefile 关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中, Makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 Makefile 就像一个Shell脚本一样,其中也可以执行操作系统的命令。
Makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释 Makefile 中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见, Makefile 都成为了一种在工程方面的编译方法。
然后来说说我对于 Makefile 的直观理解吧。首先它的基本格式是这样的:
1 | label: prerequisites... |
这里的 label 就是你 Makefile 的标签,后面所跟着的是检查所需的文件,如果文件存在则会直接执行下面的命令,如果文件不存在则需要在 Makefile 中寻找生成这些文件的方式之后,执行完对应的选项,再看看有没有这个文件,有的话就可以执行下面的命令了,如果执行完了生成那个文件的选项依然没有该文件,那么就会报错退出。
使用 make 命令编译的时候,会先找到当前目录下的 Makefile 文件,并根据你命令行的第二个参数决定要执行哪个标签下的命令。
并且它很聪明,它会根据已有文件的修改日期判断当前是否需要编译,若所需文件的最后修改日期 早于 目标文件的最后修改日期,那么它不会进行编译这个文件的操作。
这里我们这样编写 Makefile 文件
1 | ipl.img:ipl.nas |
所以我们编译就只需要 make
,运行就只需要 make run
了。
运行结果
这一章只是把昨天的字节码变成了汇编码让 nasm
去汇编成机器码,这样让我们编程更加方便了,不过今天还额外学了一下 Makefile 的用法,挺开心的。