《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
pad.c:
#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
好了,准备工作完成了,下面要正式开始啦~~
完成!