1.1_30天自制操作系统笔记_第一天_引导扇区

来源:互联网 发布:hive sql与sql区别 编辑:程序博客网 时间:2024/05/16 03:31

第一天

所需工具

首先,第一天需要的工具软件:

文本编辑器:sublime text2 或者 notepad++

汇编编译器:nasm

二进制查看工具:Bz1621.lzh

虚拟机:qemu

使用汇编生成简单的二进制文件

  1. 首先我们需要建立目录为tolset1。

  2. 在tolset1目录下建立工具目录,名称为tools。将下载的NASM软件的NASM.exe放到tools就可以了。

  3. 然后同样在tolset目录建立一个boot目录,用来放置代码。

  4. 在boot目录建立一个helloos.asm的文件。使用汇编写出如下代码:

    DB 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4fDB 0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00DB 0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00DB 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00DB 0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xffDB 0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4fDB 0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41DB 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00RESB 16DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7cDB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8aDB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xebDB 0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65DB 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72DB 0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00RESB 368DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaaDB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00RESB 4600DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00RESB 1469432

    使用命令

    nasm.exe -f bin -o helloos.IMA helloos.asm编译。编译时有warning。但是不用去管他。

    上面的命令将helloos.asm编译编译成一个二进制文件helloos.IMA。这个文件是最基本的二进制bin格式,我们可以将这个bin文件当做软盘镜像来使用。


    [参考nasm的用法]

使用QEMU虚拟机加载镜像

下载QMENU for window 1.0

解压后在Qemu-window-1.0.1目录。目录包含以下文件。官网貌似只有源码,高兴的可以自己到官网下载源码自己编译。或者直接使用他人编译好的也行。

复制helloos.IMA到此文件夹内。

使用命令加载运行。

qemu-system-i386.exe -L . -m 128 -localtime -fda helloos.IMA

运行qemu-win.bat,显示结果如下:

OK至此简单版本操作系统镜像文件完成。这是一个好的开始,虽然只能输出一个hello world.

分析helloos.img

首先,helloos.img我们是作为一个镜像文件使用的。而这个映像文件其实质包含一段内容:就是引导扇区的描述。

我们使用Bz1621.lzh工具打开刚才生成的ima文件。这个工具可以查看文件的二进制信息。

如图所示,每行显示0x0-0xF共16个字节。左边代表起始字节行数,都是使用16进制来表示。

总共是:从0x000000地址-0x167fff地址。为0x168000个字节。

如图:


2)查看文件的大小可知:

计算出000000地址-167ff0地址间的大小为: 0x168000(1474560字节)

而一张软盘大小为:1.44M(1474560) = 1.4410001024 = 8磁道 * 18扇区 * 512字节 *2

可以在属性里面查看大小:

如图:


这些数据与上面的语句都是一一对应的。比如第000000地址至000090地址内容如下:

如图:


eb 4e 90 48 45 4c 4c 4f 49 50 4c 00 02 01 01 00 02 e0 00 40 0b f0 09 00 12 00 02 00 00 00 00 00 40 0b 00 00 00 00 29 ff ff ff ff 48 45 4c 4c 4f 2d 4f 53 20 20 20 46 41 54 31 32 20 20 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b8 00 00 8e d0 bc 00 7c 8e d8 8e c0 be 74 7c 8a 04 83 c6 01 3c 00 74 09 b4 0e bb 0f 00 cd 10 eb ee f4 eb fd 0a 0a 68 65 6c 6c 6f 2c 20 77 6f 72 6c 64 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

第0001F0行内容如下

00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa f0 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00

第001400行内容如下

f0 ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00

第167ff0行结束,168000行没有数据。

汇编改进

上面的内容除了伪指令用来输出外,所有的数据都是用二进制代码表示。既然使用汇编,那么再改造一下,将输出的内容改成有意义的数字或者字符串。们将二进制码替换为可识别的字符串或者数字,由汇编编辑器在编译时转换为二进制码。

helloos.asm文件的内容改进。将其中的一些二进制码改成有意义的可读数据。

hello-os;TAB=4;以下这段是标准的FAT12格式软盘专用代码DB 0xeb, 0x4e, 0x90DB "HELLOIPL"           ;(8字节)启动器名称,任意值。字符串长度固定DW 512                  ;每个扇区的大小,大小为512字节DB 1                    ;簇的大小,大小为一个扇区DW 1                    ;FAT的起始位置(一般从第一扇区起)DB 2                    ;FAT的个数(必须为2)DW 224                  ;根目录大小(一般设置成224项)DW 2880                 ;磁盘大小(必须为2880扇区,1.44M)DB 0xf0                 ;磁盘种类(必须为0xf0)DW 9                    ;FAT长度,(必须为9扇区)DW 18                   ;每个磁道扇区数(必须为18个扇区)DW 2                    ;磁头数,(必须为2)DD 0                    ;不使用分区,(必须为0)DD 2880                 ;重写磁盘大小DB 0,0,0x29             ;签名,固定DD 0xffffffff           ;序列号DB "HELLO-OS   "        ;(11字节)磁盘名称,任意值。字符串长度固定DB "FAT12   "           ;(8字节)磁盘格式名称,任意值。字符串长度固定RESB 18                 ;空出18字节;程序主体DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7cDB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8aDB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xebDB 0xee, 0xf4, 0xeb, 0xfd;信息显示DB 0x0a, 0x0a           ;2个换行DB "hello,world"DB 0x0a                 ;换行DB 0RESB 510-($-$$)          ;填入0x00,直到510字节DB 0x55, 0xaa;启动区以外部分的输出DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00RESB 4600DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00RESB 1469432

使用命令

tools\nasm.exe -f bin -o helloos.img boot\helloos.asm

效果还是和前面的一样的。


原创粉丝点击