《Orange's 一个操作系统的实现》之笔记1
从今天开始,我们要自己设计一个超简陋的os了,主要的参考教材就是于渊的《Orange's 一个操作系统的实现》,这是一本非常非常好的书!
俗话说,工欲善其事,必先利其器,我们需要以下工具:
bochs:运行我们的os的主要平台,这是一个x86指令集模拟器,非常强大。安装步骤可以参考:
nasm:一个非常好用的汇编器,我们的汇编代码就要用它编译成机器指令。安装步骤可以参考:
软盘制作工具:我们的所有程序最终都会写到一块软盘上,因此我们需要这么一个工具。
不过我们完全可以自己写一个软盘制作工具,需要了解的知识就是一块软盘的大小为1440k(1474560bytes),并且第一个512字节的最后两个字节是0x55,0xaa。知道上面两点就可以了。直接贴代码:
Makefile:
all: gcc -Wall -o pad pad.c clean: rm -rf *.o pad
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> int fileExist(char * fileName) { if((access(fileName, F_OK)) == 0) { return 1; } else { return 0; } } long getFileLength(char * fileName) { long length; FILE * fp; fp = fopen(fileName, "r"); if(!fp) { return 0; } fseek(fp, 0, SEEK_END); length = ftell(fp); fseek(fp, 0, SEEK_SET); fclose(fp); return length; } void printUsage() { printf("usage: pad src dst size(bytes)\n"); } int main(int argc, char * argv[]) { if(argc != 4) { printUsage(); exit(1); } if(!fileExist(argv[1])) { printf("\'%s\' not exist!\n", argv[1]); exit(1); } if(fileExist(argv[2])) { printf("\'%s\' already exists!\n", argv[2]); exit(1); } char * temp; int c; long i; long size = strtol(argv[3], &temp, 10); long leng = getFileLength(argv[1]); FILE * in = fopen(argv[1], "r"); FILE * out = fopen(argv[2], "w"); for(i=0; i<size; ++i) { if((c = fgetc(in)) == EOF) { break; } fputc(c, out); } for(i=leng; i<size; ++i) { fputc(0x00, out); } /* floppy id */ if(size >= 512) { fseek(out, 510, SEEK_SET); fputc(0x55, out); fputc(0xaa, out); } return 0; }
这个程序如果去掉最后的设置55aa的部分,就是一个通用的程序了,命令行为:pad src dst size,其中src是源文件路径,dst是新建文件的路径,size是以字节计算的大小。因此pad程序的功能是:
新建一个大小为size字节的dst文件,并且将src文件copy过去,剩余的部分用0填充,如果src大于size字节,则截短为size。
而对于我们的软盘制作工具,可以这样调用:
pad src dst 1474560
好了,准备工作完成了,下面要正式开始啦~~