终于有时间来做第一天的事了。第一天作者别出心裁,使用普通的二进制编辑器直接编写代码。作者目的是制作在FAT12格式的上运行的操作系统。编译出来后是一个Raw Disk Image,当然也可以直接在虚拟机上跑。
二话不说,看代码。我比较懒惰,直接使用xxd输出作者原有系统的代码。然后稍微修改点字符,就当完成了。然后再xxd -r就行了。
1 2 3 4 5 6 7 8 9 | 0000000: eb4e 9048 454c 4c4f 4950 4c00 0201 0100 .N.HELLOIPL..... 0000010: 02e0 0040 0bf0 0900 1200 0200 0000 0000 ...@............ 0000020: 400b 0000 0000 29ff ffff ff48 454c 4c4f @.....)....HELLO 0000030: 2d4f 5320 2020 4641 5431 3220 2020 0000 -OS FAT12 .. 0000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000050: b800 008e d0bc 007c 8ed8 8ec0 be74 7c8a .......|.....t|. 0000060: 0483 c601 3c00 7409 b40e bb0f 00cd 10eb ....<.t......... 0000070: eef4 ebfd 0a0a 4865 6c6c 6f2c 204c 696e ......Hello, Lin 0000080: 7578 0a00 0000 0000 0000 0000 0000 0000 ux.............. |
这里其实是手动写了个FAT12的磁盘文件系统。详细的FAT12见链接。
二进制编辑实在蛋疼,还要查ascii码表。所以作者马上升级,让我们使用nasm汇编。汇编比二进制不知道高到哪去了。下面是整个汇编程序。因为作者建议使用他的nask,然后可能与nasm不兼容,比如RESB中0x1fe-($-$$)要这么写。。编译一发,就能得到bootable的磁盘。在这里我就改了比较多的字符。详细代码见github。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | ; slef-os ; TAB=4 ;标准FAT12格式软盘 DB 0xeb, 0x4e, 0x90 ;0-2 jump to bootstrap 4e DB "HELLOIPL" ;启动区名称 8字节 DW 512 ;每个sector的大小 512字节 DB 1 ;簇(cluster)大小 1个扇区 DW 1 ;FAT起始位置 DB 2 ;FAT个数 DW 224 ;根目录大小 DW 2880 ;磁盘大小 2880sector DB 0xf0 ;磁盘种类 DW 9 ;FAT长度 DW 18 ;1 track多少扇区 DW 2 ;磁头数 DD 0 ;不使用分区 DD 2880 ;重写磁盘大小 DB 0,0,0x29 ;固定 DD 0xffffffff ;卷标 DB "Slef-OS " ;磁盘名称 11字节 DB "FAT12 " ;磁盘格式名称 8字节 RESB 18 ;空18字节 ;程序主体 DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09 DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb DB 0xee, 0xf4, 0xeb, 0xfd ;信息显示 DB 0x0a, 0x0a ; 换行两次 DB "hello, world!" DB 0x0a ; DB "I'm slinuxer!" DB 0x0a ; DB 0 RESB 0x1fe-($-$$) ; 写0x00直到0x001fe(510) DB 0x55, 0xaa ;511,512必须为55aa ;启动区以外的输出 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 1469432 |
有兴趣的可以仔细研究一下上面的代码代表的意思。不难,根据详细的FAT12,就能知道其中的含义。其中前3个bytes中的第2个貌似只有jump到空的区域就没有问题,这里3e~4e都行。
链接:
1. fat