imtinge

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去调用。看得没兴趣了……

posted on 2012-10-25 21:21  imtinge  阅读(293)  评论(1)    收藏  举报