《自己动手写操作系统》—— 工作环境搭建

最近在看《自己动手写操作系统》 于渊著,看第一页头就蒙了,书上说要准备一张空白软盘,都2010年了,上哪去找软盘啊,自从接触计算机以来我还没见过软盘呢,估计要到科技博物馆才找得到吧,呵呵。其实在第二章-搭建你的工作环境 中作者提到其实并不需要用真正的软盘,用虚拟软盘映像就可以了,也就是*.IMG文件,反过来想想,连计算机都可以虚拟,软盘当然也可以虚拟了。软盘映像文件并不需要自己制作,随书附赠的光盘中的源代码里面就有(TINIX.IMG),将自己写的汇编源代码编译成*.bin文件后使用作者提供的软盘绝对扇区读写工具FloppyWriter将*.bin写入到TINIX.IMG,这样一张虚拟的引导盘就完成了。FloppyWriter工具在光盘的Tools文件夹中。如果没有光盘也不要紧,可以在博文视点网站下载,网址是:http://www.broadview.com.cn/01577 (需要先登录),也可以在http://osfromscratch.org/downloadcn 下载源代码。
   
一、 开始搭建工作环境:
    1. 一台计算机(Windows操作系统)
    2. 虚拟机 VirtualBox
       可以在官网下载,下载地址:http://www.virtualbox.org/wiki/Downloads
       之所以选择VirtualBox是因为它是开源免费的,速度也可以,作者使用的虚拟机是Virtual PC 5.0,该虚拟机是商业软件,5.0版本的比较难找,网上可以找到5.2版本的,但我下载安装后不能正常运行,提示不能在PAE模式下运行,虽然网上可以找到解决方案,需要对电脑做些配置,但觉得麻烦,个人还是喜欢用VirtualBox,下载安装后没有任何问题。
    3. NASM 汇编编译程序
      下载地址:http://sourceforge.net/projects/nasm
      或者官网下载:http://www.nasm.us/pub/nasm/releasebuilds/
      这个是用来编译我们写的汇编程序的,以前常用MASM,但作者推荐这个。
    4. 软盘绝对扇区读写工具 FloppyWriter.exe
       在随书附赠的光盘中提供,在OS/Tools/FloppyWriter/Release文件夹下,运行 该程序有两个按钮可以选择,使用软盘映像的话使用下面那个Write File To Image。前面提到,如果没有光盘,可以去网上去下载光盘中的内容。
    5. 源代码编辑器
       可以用记事本,也可以用其他编辑工具。

二、写一个小的“操作系统”
     1.编写源代码:(书上有)
      ;boot.asm
      org 07c00h      ;告诉编译器程序加载到7c00处
       mov ax, cs
       mov ds, ax
       mov es, ax
       call DispStr    ;调用显示字符串例程
       jmp $           ;无限循环
DispStr:
       mov ax, BootMessage
       mov bp, ax       ;es:bp=串地址
       mov cx, 33
       mov ax, 01301h   ;ah=13, al=01h
       mov bx, 000ch    ;页号为0(bh=0) 黑底红字(bl=0ch,高亮)
       mov dl, 0
       int 10h          ;10h 号中断
       ret
BootMessage:       db  "Hello lijie, Welcome to OS World!"
times  510-($-$$)  db 0 ;填充剩下的空间,使生成的二进制代码恰好为512字节
dw     0xaa55           ;结束标志

   
     2. 编译boot.asm
      安装或解压缩NASM后,将NASM的安装目录加到PATH环境变量中后就可以在命令行的任何目录下使用NASM命令。进入到源代码所在目录,输入命令 nasm boot.asm -o boot.bin 后回车便完成了源代码的编译。
     3.将boot.bin写到TINIX.IMG
       从光盘源代码中复制TINIX.IMG文件到你的源代码目录下,运行FloppyWriter.exe,点击Write File To Image,分别在弹出窗口中选择boot.bin和TINIX.IMG,提示成功 OK。
     4. 在虚拟机中运行
       a.在虚拟机中新建一台PC
        启动VirtualBox->新建->名称任意取,操作系统选Other,Version选Other/Unknown->内存默认(可改变)->创建新的虚拟硬盘->动态扩展->选择虚拟硬盘的保存地址或默认,大小默认(可改变)->完成。
       b.将TINIX.IMG注册到VirtualBox
        管理(F)->虚拟介质管理(V)->虚拟软盘(F)->注册(A)->在弹出窗口中找到刚刚制作完成的TINIX.IMG打开->确定。
       c.运行刚刚创建的PC

        选择刚刚创建的PC->开始->首次运行向导->下一步->介质类型选软驱,介质位置选刚刚注册的TINIX.IMG->下一步->完成。OK,应该可以看到哪一行黑底红字了吧,呵呵。


第二种方法:

最近在业余阅读时找到一本《自己动手编写操作系统》觉得不错,视角很新颖,是有关操作系统书籍中为数不多的看了不想睡觉的读本。

 

由于这本书的出版时间较早,书中引导盘还使用的是软盘,所以在跟随做的第一个实验代码时就遇到些小困难。最后实验成果后在此做个记录。

 

书中第一个实验就是编写一段汇编代码作为引导程序,编译后将二进制文件写入到引导盘(书中采用的是软盘),然后让电脑从软盘启动进而执行我们的引导程序。

 

首先给出书中的引导程序——boot.asm


    org 07c00h
    mov    ax,    cs
    mov    ds,    ax
    mov    es,    ax
    call DispStr
    jmp $
DispStr:
    mov    ax,    BootMessage
    mov    bp,    ax
    mov    cx,    16
    mov    ax,    01301h
    mov    bx,    000ch
    mov    dl,    0
    int    10h
    ret
BootMessage:    db    "Hello, OS world!"
    times    510-($-$$)    db    0
    dw 0xaa55


下面则需要对这段汇编代码进行编译,于是我们就遇到了第一个问题:选择什么样的编译器?如何编译代码?

书中推荐了使用NASM,至于为什么要选择NASM,大家可以百度一下NASM诞生的故事,它的诞生就是因为诸多汇编编译器的种种劣势,最后催生出NASM这个比较好用的编译器。

安装NASM。NASM没有图形化界面,要么装在DOS下,要么装在Linux下。本人的电脑是WIN8+Ubuntu的虚拟机,所以果断选择在Ubuntu中安装了NASM只需要在终端敲上apt-get install nasm,然后等着安装完成即可。安装后测试下:

 

01.jpg
安装完成编译器后将windows下编写好的代码拷贝到Ubuntu中用编译器编译,发现出错。编译生成的二进制文件boot.bin大小为0,并不是我们期望的512字节。
于是便在Ubuntu下用vi打开我们的汇编代码查看一下,发现:
02.jpg
在代码中出现了很多的“^M”字符。
哦,原来我用了DOS格式的文件放在了UNIX下面进行了编译,难怪编译器不认识。
注意:在DOS格式下面,回车换行是0x0D0A,而UNIX下是0x0A,所以当DOS格式文件到了UNIX下面后0x0D则会变成“^M”这个控制字符。
03.jpg
这个问题的解决也有很多种方法,而本人是直接在UE中把文件都改成用UNIX格式编辑了:
04.jpg
 
修改了格式以后,在Ubuntu下可以正确编译了!生成了一个512字节大小的二进制文件boot.bin。
 
下面就该是制作启动盘的问题了。要知道,现在的电脑想要用软盘启动已经是不可能了。但是我们有个东西叫虚拟机——它可以给我们提供一个“软盘”接口,不过同样也是个虚拟接口。
 
虚拟机我用的是VM Player,并没有去用workstation,因为新版本的player已经功能够强大了。如下图一步步建立自己的虚拟机,但是在驱动选择时,选从软盘启动。
05.jpg
06.jpg
07.jpg
08.jpg
09.jpg
我们得为软盘提供一个image文件,但之前对boot.asm文件编译后得到的是二进制文件boot.bin。网上也有很多提出的方法如何将bin文件打包成img文件,其实我们简单分析一下会发现,两者的转换其实只需要在windows下改一下后缀名!!!原因是:img文件也就是镜像文件,原本就是对软盘中的数据进行二进制级别的拷贝备份,而我们的bin文件本身就是二进制文件,所以对于内存或者存储设备来说,在这个地方img和bin文件是完全一样的。
 
将boot.bin改后缀变成boot.img后就可以让虚拟机去加载它了。
然后去启动你的“操作系统”吧!
 
展开阅读全文

没有更多推荐了,返回首页