现在的位置: 首页 > 综合 > 正文

Orange’s 一个操作系统的实现之笔记1

2013年10月06日 ⁄ 综合 ⁄ 共 1560字 ⁄ 字号 评论关闭

《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

好了,准备工作完成了,下面要正式开始啦~~

完成!

抱歉!评论已关闭.