自制操作系统第一周总结

第一个任务是启动。

计算机的启动,参考本篇:
http://www.cnblogs.com/rixiang/p/5075825.html

两个重要的概念:

1,boot:

软盘的第一个扇区区为启动区。(计算机读写软盘的时候,不是一个字节一个字节的读取的,而是512字节为一个单位来读写。因此,软盘的512字节为一个扇区。一张软盘的空间共有1440KB,也就是1474560字节,2880个扇区。)

2,IPL:

启动程序加载器。启动区只有区区512字节,实际的操作系统根本装不进去。所以几乎所有的操作系统,都是把加载操作系统本身的程序放在启动区里的。

前者boot这512字节是启动电脑的关键区域,而位于这一区域的IPL是一段程序,用于将操作系统从软盘,加载到磁盘里。

最初的IPL汇编代码,虽为IPL,但实际上此时并没有装载任何程序:

 1 ; hello-os
 2 ; TAB=4
 3
 4         ORG        0x7c00            ; このプログラムがどこに読み込まれるのか
 5
 6 ; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述
 7
 8         JMP        entry
 9         DB        0x90
10         DB        "HELLOIPL"        ; ブートセクタの名前を自由に書いてよい(8バイト)
11         DW        512                ; 1セクタの大きさ(512にしなければいけない)
12         DB        1                ; クラスタの大きさ(1セクタにしなければいけない)
13         DW        1                ; FATがどこから始まるか(普通は1セクタ目からにする)
14         DB        2                ; FATの個数(2にしなければいけない)
15         DW        224                ; ルートディレクトリ領域の大きさ(普通は224エントリにする)
16         DW        2880            ; このドライブの大きさ(2880セクタにしなければいけない)
17         DB        0xf0            ; メディアのタイプ(0xf0にしなければいけない)
18         DW        9                ; FAT領域の長さ(9セクタにしなければいけない)
19         DW        18                ; 1トラックにいくつのセクタがあるか(18にしなければいけない)
20         DW        2                ; ヘッドの数(2にしなければいけない)
21         DD        0                ; パーティションを使ってないのでここは必ず0
22         DD        2880            ; このドライブ大きさをもう一度書く
23         DB        0,0,0x29        ; よくわからないけどこの値にしておくといいらしい
24         DD        0xffffffff        ; たぶんボリュームシリアル番号
25         DB        "HELLO-OS   "    ; ディスクの名前(11バイト)
26         DB        "FAT12   "        ; フォーマットの名前(8バイト)
27         RESB    18                ; とりあえず18バイトあけておく
28
29 ; プログラム本体
30
31 entry:
32         MOV        AX,0            ; レジスタ初期化
33         MOV        SS,AX
34         MOV        SP,0x7c00
35         MOV        DS,AX
36         MOV        ES,AX
37
38         MOV        SI,msg
39 putloop:
40         MOV        AL,[SI]
41         ADD        SI,1            ; SIに1を足す
42         CMP        AL,0
43         JE        fin
44         MOV        AH,0x0e            ; 一文字表示ファンクション
45         MOV        BX,15            ; カラーコード
46         INT        0x10            ; ビデオBIOS呼び出し
47         JMP        putloop
48 fin:
49         HLT                        ; 何かあるまでCPUを停止させる
50         JMP        fin                ; 無限ループ
51
52 msg:
53         DB        0x0a, 0x0a        ; 改行を2つ
54         DB        "hello, world"
55         DB        0x0a            ; 改行
56         DB        0
57
58         RESB    0x7dfe-$        ; 0x7dfeまでを0x00で埋める命令
59
60         DB        0x55, 0xaa
61
62 ; 以下はブートセクタ以外の部分の記述
63
64         DB        0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
65         RESB    4600
66         DB        0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
67         RESB    1469432

接下来,就是要写真正的IPL程序。

上文已述,一张软盘的质量为1440KB。

含有IPL的启动区,位于C0-HO-S1(柱面0,磁头0,扇区1)。下一个扇区是C0-H0-S2。首先装载这一扇区。直至C0-H0-S18。

C0-H0-S18的下一个扇区是软盘反面的C0-H1-S1。按顺序读到C0-H1-S18。

然后下一个柱面,C1-H0-S1。最后直至C9-H1-S18。

  1 ; haribote-ipl
  2 ; TAB=4
  3
  4 CYLS    EQU        10                ; どこまで読み込むか
  5
  6         ORG        0x7c00            ; このプログラムがどこに読み込まれるのか
  7
  8 ; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述
  9
 10         JMP        entry
 11         DB        0x90
 12         DB        "HARIBOTE"        ; ブートセクタの名前を自由に書いてよい(8バイト)
 13         DW        512                ; 1セクタの大きさ(512にしなければいけない)
 14         DB        1                ; クラスタの大きさ(1セクタにしなければいけない)
 15         DW        1                ; FATがどこから始まるか(普通は1セクタ目からにする)
 16         DB        2                ; FATの個数(2にしなければいけない)
 17         DW        224                ; ルートディレクトリ領域の大きさ(普通は224エントリにする)
 18         DW        2880            ; このドライブの大きさ(2880セクタにしなければいけない)
 19         DB        0xf0            ; メディアのタイプ(0xf0にしなければいけない)
 20         DW        9                ; FAT領域の長さ(9セクタにしなければいけない)
 21         DW        18                ; 1トラックにいくつのセクタがあるか(18にしなければいけない)
 22         DW        2                ; ヘッドの数(2にしなければいけない)
 23         DD        0                ; パーティションを使ってないのでここは必ず0
 24         DD        2880            ; このドライブ大きさをもう一度書く
 25         DB        0,0,0x29        ; よくわからないけどこの値にしておくといいらしい
 26         DD        0xffffffff        ; たぶんボリュームシリアル番号
 27         DB        "HARIBOTEOS "    ; ディスクの名前(11バイト)
 28         DB        "FAT12   "        ; フォーマットの名前(8バイト)
 29         RESB    18                ; とりあえず18バイトあけておく
 30
 31 ; プログラム本体
 32
 33 entry:
 34         MOV        AX,0            ; レジスタ初期化
 35         MOV        SS,AX
 36         MOV        SP,0x7c00
 37         MOV        DS,AX
 38
 39 ; ディスクを読む
 40
 41         MOV        AX,0x0820
 42         MOV        ES,AX
 43         MOV        CH,0            ; シリンダ0
 44         MOV        DH,0            ; ヘッド0
 45         MOV        CL,2            ; セクタ2
 46 readloop:
 47         MOV        SI,0            ; 失敗回数を数えるレジスタ
 48 retry:
 49         MOV        AH,0x02            ; AH=0x02 : ディスク読み込み
 50         MOV        AL,1            ; 1セクタ
 51         MOV        BX,0
 52         MOV        DL,0x00            ; Aドライブ
 53         INT        0x13            ; ディスクBIOS呼び出し
 54         JNC        next            ; エラーがおきなければnextへ
 55         ADD        SI,1            ; SIに1を足す
 56         CMP        SI,5            ; SIと5を比較
 57         JAE        error            ; SI >= 5 だったらerrorへ
 58         MOV        AH,0x00
 59         MOV        DL,0x00            ; Aドライブ
 60         INT        0x13            ; ドライブのリセット
 61         JMP        retry
 62 next:
 63         MOV        AX,ES            ; アドレスを0x200進める
 64         ADD        AX,0x0020
 65         MOV        ES,AX            ; ADD ES,0x020 という命令がないのでこうしている
 66         ADD        CL,1            ; CLに1を足す
 67         CMP        CL,18            ; CLと18を比較
 68         JBE        readloop        ; CL <= 18 だったらreadloopへ
 69         MOV        CL,1
 70         ADD        DH,1
 71         CMP        DH,2
 72         JB        readloop        ; DH < 2 だったらreadloopへ
 73         MOV        DH,0
 74         ADD        CH,1
 75         CMP        CH,CYLS
 76         JB        readloop        ; CH < CYLS だったらreadloopへ
 77
 78 ; 読み終わったけどとりあえずやることないので寝る
 79
 80 fin:
 81         HLT                        ; 何かあるまでCPUを停止させる
 82         JMP        fin                ; 無限ループ
 83
 84 error:
 85         MOV        SI,msg
 86 putloop:
 87         MOV        AL,[SI]
 88         ADD        SI,1            ; SIに1を足す
 89         CMP        AL,0
 90         JE        fin
 91         MOV        AH,0x0e            ; 一文字表示ファンクション
 92         MOV        BX,15            ; カラーコード
 93         INT        0x10            ; ビデオBIOS呼び出し
 94         JMP        putloop
 95 msg:
 96         DB        0x0a, 0x0a        ; 改行を2つ
 97         DB        "load error"
 98         DB        0x0a            ; 改行
 99         DB        0
100
101         RESB    0x7dfe-$        ; 0x7dfeまでを0x00で埋める命令
102
103         DB        0x55, 0xaa

此时已将软盘最初的10×2×18×512=184320byte=180KB内容装载到内存(具体内容就是汇编知识了)

内存0x08200到0x34ffff。

装载之后自然就是启动操作系统的过程。

比如在软盘0x004200地址有一个程序。那么启动它就要到内存0x8000+0x4200 = 0xc200地址。

此时,系统启动的工作其实已经告一段落,接下来作者做的工作就是导入C语言。

以及添入一个简单界面显示的程序。

这样一来就是从启动区开始加载操作系统到内存,然后运行图形界面程序。

理解上已经无碍了。

具体设计的就是画面显示方面的知识。

时间: 2024-10-18 09:02:54

自制操作系统第一周总结的相关文章

30天自制操作系统第一天--helloworld

第一天是用二进制编辑器写helloworldos 百度bz.exe这个二进制编辑器下载 在bz里边敲入或复制进十六进制的数据,保存为.img格式 作者是用qemu模拟器运行了这个系统. 我另外用VMware软盘加载这个img文件也能成功显示出hello world 注:01fe处必须是55AA.即第一扇区最后俩字节是55AA

【自制操作系统06】终于开始用 C 语言了,第一行内核代码!

一.整理下到目前为止的流程图 写到这,终于才把一些苦力活都干完了,也终于到了我们的内核代码部分,也终于开始第一次用 c 语言写代码了!为了这个阶段性的胜利,以及更好地进入内核部分,下图贴一张到目前为止的流程图.(其中黄色部分是今天准备做的事情) 二.先上代码 loader.asm ... ;加载kernel mov eax,0x9 ;kernel.bin所在的扇区号 0x9 mov ebx,0x70000 ;写入的内存地址 0x70000 mov ecx,200 ;读入的扇区数 call rd_

20155336 2016-2017-2《JAVA程序设计》第一周学习总结

# 20155336  2016-2017-2<JAVA程序设计>第1周学习总结 ## 教材学习内容总结 开学的第一周,带着些许的欣喜和好奇,听完了老师的第一堂课.说心里话学习JAVA仿佛观看一部英文影视作品一样头疼, 因为总会有许许多多相似的名字让你记得晕头转向.JAVA也是一样,什么JVM啊JRE啊JDK啊 (/(ㄒoㄒ)/~~)  等等一系列 的英文缩写,让人心神意乱~~但总体上对JAVA有了一个初步的了解.通过课上老师的介绍以及课下对JAVA书第一章的浏览, 我简单的了解了JAVA艰辛

20145216 史婧瑶《信息安全系统设计基础》第一周学习总结

20145216 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 Linux基础 1.ls命令 ls或ls .显示是当前目录的内容,这里“.”就是参数,表示当前目录,是缺省的可以省略.我们可以用ls -a .显示当前目录中的所有内容,包括隐藏文件和目录.其中“-a” 就是选项,改变了显示的内容.如图所示: 2.man命令 man命令可以查看帮助文档,如 man man : 若在shell中输入 man+数字+命令/函数 即可以查到相关的命令和函数:若不加数字,那man命令默认从数字较

《嵌入式设计》第一周学习总结

<嵌入式设计>第一周学习总结 学习时遇到的主要问题 1.运行环境未及时安装 2.命令不熟练 3.上课状态不好 解决方法 1.及时安装环境并熟悉运行 2.参考Linux操作系统实用教程并百度一些问题的解决办法 3.及时调整自己状态 主要学习内容 Linux一些简单基本的操作, 用.c文件输出hello word 用vi test.c 创建.c文件 #include <stdio.h> int main(){ printf("hello word\n"); } 并用

20145321曾子誉《Java程序设计》第一周学习总结

20145321 <Java程序设计>第1周学习总结 教材学习内容总结 第一章 1.三大平台:Java SE.Java EE .Java ME 2.Java SE:由JVM.JRE.JDK.Java语言四部分组成. JVM:操作系统,虚拟机. JRE:执行环境,包括JVM. JDK:包含JRE及开发过程中需要的一些工具程序. 3.JCP.JSR.RI.TCK的关系:任何想要提议加入Java的功能或特性,必须以JSR正式文件的方式提交,经过JCP这个国际组织投票通过,成为最终文件,由此做出的参考

20145201 《Java程序设计》第一周学习总结

# 20145201 <Java程序设计>第一周学习总结 ## 教材学习内容总结 万事开头难,终于开始学习了Java.寒假的时候看到老师的要求确实有点慌,但是这周翻开书,从书本知识第一行学起,发现并不是自己想想中那么难,只要一步一个脚印,每周有自己的计划,并按照计划按部就班的完成,最后一定会拥有自己的小成果的. 1.1Java不只是语言 Java经过多年的版本更新后,最新的版本是Java SE8. 在java发展的过程中,它的应用领域越来越广,根据不同级别的应用开发区分了不同的应用版本,最终j

20145326蔡馨熠《Java程序设计》第一周学习总结

20145326蔡馨熠 <Java程序设计>第一周学习总结 教材学习内容总结 转眼间新的一学期终于开始了!为什么我这么期待呢?因为这学期可以上娄嘉鹏老师的java程序设计课,我不是什么电脑天才,之前c语言学得也不是特别好.可我就是对hdl和java特别感兴趣(之前在我的问卷调查报告里面提到过),并且寒假的时候在家里也预习了一部分java知识.第一周要求学习两个章节并作心得体会,虽然我早已看过前两章的知识,不过为了进一步巩固,我还是用了星期六一天的时间把第一章和第二章的知识从头到尾仔仔细细的看了

信息安全系统设计基础——第一周学习过程记录与总结体会

第一周学习过程记录与总结体会 第1节    Linux系统简介 1.Linux操作系统:即内核和系统调用两层 2.Linux与Windows的不同: (1)免费与收费 (2)软件与支持 (3)安全性 (4)使用习惯 (5)可定制性 (6)应用范畴 (7)各自缺乏的 3.如何学习Linux (1)明确态度,形成良好学习心态 (2)重视基础,从头学习 第2节  基本概念及操作 1.桌面环境介绍 通过内核—服务器(X.org) —客户端(X.client)实现完整的桌面环境,与Windows不同. 2