30天自制操作系统……1
30天自制操作系统,是个叫川合秀实的日本人写的,教人怎样做出一个“所谓”的操作系统。
目前看了前两天,做个总结:
一开始叫人用binary editor写二进制文件,做一个可启动的软盘镜像,后面就开始解释这个0123456789ABCDEF是怎么来的,然后又用汇编写了几遍。
程序的意思就是开机启动,然后打出一个hello world.
里面用了一个叫qemu的软件来模拟pc启动这个软盘镜像。运行起来是这样的:

其实直接看第五天工程(如果可以这么叫的话)文件夹里的代码比较方便。把二进制和汇编对应起来看(原来就是日文,开始以为是中文怎么调都乱码):
1 1 00000000 ; hello-os ;号表示是注释 2 2 00000000 ; TAB=4 3 3 00000000 4 4 ORG 0x7c00 ; このプログラムがどこに読み込まれるのか 读入内存0x7c00,当龟腚吧 5 5 00007C00 6 6 00007C00 ; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述 下面是FAT12格式软盘的代码 7 7 00007C00 8 8 00007C00 EB 4E JMP entry ;跳出去执行 9 9 00007C02 90 DB 0x90 10 10 00007C03 48 45 4C 4C 4F 49 50 4C DB "HELLOIPL" ; ブートセクタの名前を自由に書いてよい(8バイト)启动区名可随意写8byte 11 11 00007C0B 0200 DW 512 ; 1セクタの大きさ(512にしなければいけない)扇区大小 12 12 00007C0D 01 DB 1 ; クラスタの大きさ(1セクタにしなければいけない) 13 13 00007C0E 0001 DW 1 ; FATがどこから始まるか(普通は1セクタ目からにする) 14 14 00007C10 02 DB 2 ; FATの個数(2にしなければいけない) 15 15 00007C11 00E0 DW 224 ; ルートディレクトリ領域の大きさ(普通は224エントリにする) 16 16 00007C13 0B40 DW 2880 ; このドライブの大きさ(2880セクタにしなければいけない) 17 17 00007C15 F0 DB 0xf0 ; メディアのタイプ(0xf0にしなければいけない) 18 18 00007C16 0009 DW 9 ; FAT領域の長さ(9セクタにしなければいけない) 19 19 00007C18 0012 DW 18 ; 1トラックにいくつのセクタがあるか(18にしなければいけない) 20 20 00007C1A 0002 DW 2 ; ヘッドの数(2にしなければいけない) 21 21 00007C1C 00000000 DD 0 ; パーティションを使ってないのでここは必ず0 22 22 00007C20 00000B40 DD 2880 ; このドライブ大きさをもう一度書く 23 23 00007C24 00 00 29 DB 0,0,0x29 ; よくわからないけどこの値にしておくといいらしい 24 24 00007C27 FFFFFFFF DD 0xffffffff ; たぶんボリュームシリアル番号 25 25 00007C2B 48 45 4C 4C 4F 2D 4F 53 20 20 DB "HELLO-OS " ; ディスクの名前(11バイト)磁盘名,11byte 26 00007C35 20 27 26 00007C36 46 41 54 31 32 20 20 20 DB "FAT12 " ; フォーマットの名前(8バイト) 28 27 00007C3E 00 00 00 00 00 00 00 00 00 00 RESB 18 ; とりあえず18バイトあけておく 29 00007C48 00 00 00 00 00 00 00 00 30 28 00007C50 31 29 00007C50 ; プログラム本体 主程序 32 30 00007C50 33 31 00007C50 entry: 34 32 00007C50 B8 0000 MOV AX,0 ; レジスタ初期化 寄存器初始化 35 33 00007C53 8E D0 MOV SS,AX 36 34 00007C55 BC 7C00 MOV SP,0x7c00 ;不懂这句为什么要0x7c00,改成其他好像也能用 37 35 00007C58 8E D8 MOV DS,AX 38 36 00007C5A 8E C0 MOV ES,AX 39 37 00007C5C 40 38 00007C5C BE 7C74 MOV SI,msg 41 39 00007C5F putloop: 42 40 00007C5F 8A 04 MOV AL,[SI] 43 41 00007C61 83 C6 01 ADD SI,1 ; SIに1を足す 44 42 00007C64 3C 00 CMP AL,0 45 43 00007C66 74 09 JE fin 46 44 00007C68 B4 0E MOV AH,0x0e ; 一文字表示ファンクション 47 45 00007C6A BB 000F MOV BX,15 ; カラーコード 48 46 00007C6D CD 10 INT 0x10 ; ビデオBIOS呼び出し 49 47 00007C6F EB EE JMP putloop 50 48 00007C71 fin: 51 49 00007C71 F4 HLT ; 何かあるまでCPUを停止させる 52 50 00007C72 EB FD JMP fin ; 無限ループ 53 51 00007C74 54 52 00007C74 msg: 55 53 00007C74 0A 0A DB 0x0a, 0x0a ; 改行を2つ 56 54 00007C76 68 65 6C 6C 6F 2C 20 77 6F 72 DB "hello, world" 57 00007C80 6C 64 58 55 00007C82 0A DB 0x0a ; 改行 59 56 00007C83 00 DB 0 60 57 00007C84 61 58 00007C84 00 00 00 00 00 00 00 00 00 00 RESB 0x7dfe-$ ; 0x7dfeまでを0x00で埋める命令 写00,因为要凑满一个扇区 62 00007C8E 00 00 00 00 00 00 00 00 00 00 63 00007C98 00 00 00 00 00 00 00 00 00 00 64 00007CA2 00 00 00 00 00 00 00 00 00 00 65 00007CAC 00 00 00 00 00 00 00 00 00 00 66 00007CB6 00 00 00 00 00 00 00 00 00 00 67 00007CC0 00 00 00 00 00 00 00 00 00 00 68 00007CCA 00 00 00 00 00 00 00 00 00 00 69 00007CD4 00 00 00 00 00 00 00 00 00 00 70 00007CDE 00 00 00 00 00 00 00 00 00 00 71 00007CE8 00 00 00 00 00 00 00 00 00 00 72 00007CF2 00 00 00 00 00 00 00 00 00 00 73 00007CFC 00 00 00 00 00 00 00 00 00 00 74 00007D06 00 00 00 00 00 00 00 00 00 00 75 00007D10 00 00 00 00 00 00 00 00 00 00 76 00007D1A 00 00 00 00 00 00 00 00 00 00 77 00007D24 00 00 00 00 00 00 00 00 00 00 78 00007D2E 00 00 00 00 00 00 00 00 00 00 79 00007D38 00 00 00 00 00 00 00 00 00 00 80 00007D42 00 00 00 00 00 00 00 00 00 00 81 00007D4C 00 00 00 00 00 00 00 00 00 00 82 00007D56 00 00 00 00 00 00 00 00 00 00 83 00007D60 00 00 00 00 00 00 00 00 00 00 84 00007D6A 00 00 00 00 00 00 00 00 00 00 85 00007D74 00 00 00 00 00 00 00 00 00 00 86 00007D7E 00 00 00 00 00 00 00 00 00 00 87 00007D88 00 00 00 00 00 00 00 00 00 00 88 00007D92 00 00 00 00 00 00 00 00 00 00 89 00007D9C 00 00 00 00 00 00 00 00 00 00 90 00007DA6 00 00 00 00 00 00 00 00 00 00 91 00007DB0 00 00 00 00 00 00 00 00 00 00 92 00007DBA 00 00 00 00 00 00 00 00 00 00 93 00007DC4 00 00 00 00 00 00 00 00 00 00 94 00007DCE 00 00 00 00 00 00 00 00 00 00 95 00007DD8 00 00 00 00 00 00 00 00 00 00 96 00007DE2 00 00 00 00 00 00 00 00 00 00 97 00007DEC 00 00 00 00 00 00 00 00 00 00 98 00007DF6 00 00 00 00 00 00 00 00 99 59 00007DFE 100 60 00007DFE 55 AA DB 0x55, 0xaa ;又一个龟腚,扇区最后两个不是55AA会错
解释一下:
一开头要求把程序加载到0x7c00,规定
然后让跳到entry去执行,jmp下面是fat12的格式
entry那块就是打印出msg里面的东西,就是\n\nhello world\n
写满512,把最后两个改成55AA
一个引导扇区就写好了。
当然后面还需要写些东西来填到1.44M一个软盘大小,基本是用零,但是
地址0001F0和001400是F0 FF FF后面全是零,为什么会这样,现在还不知道
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
看到第四天,觉得里面就是写c函数,用汇编实现,再用c去调用。看得没兴趣了……
浙公网安备 33010602011771号