1. 进入32位模式并导入C语言
制作真正的IPL(启动程序加载器)-用他来装载程序
BIOS 0x13号函数(INT 0x13)读写磁盘。将硬盘内容装入内存。
JC error ;jump if carry,如果有进位标志则跳转到error。
2. 软盘就像一棵树的截面,他有上下两面,向上的面用磁头0读写,下面用磁头1读写。
树有很多年轮,软盘也类似,软件年轮之间的部分叫柱面(cylinder),上下各有80个柱面,最外是柱面0,再是柱面1,。。。一直到最里面的柱面79,下面也是一样。每个柱面又分18个扇区sector(1-18号)。一个扇区可存储512字节。
3. 综上所述,1个软盘有2个磁头,(一个磁面有)80个柱面,(一个柱面有)18个扇区,一个扇区有512个字节。所以,一个软盘的容量是:
2*80*18*512 = 1474560 byte = 1440 kB。
含有IPL的启动区位于:C0-H0-S1 (Cylinder,magnetic Head,Sector)
柱面0,磁头0,扇区 1,下一个扇区是:C0-H0-S2。
4. MOV AL,[ES:BX] ; ES*16+BX -> AL
5. 启动区:0x8000-0x81ff。???文中说此地址留给启动区,启动区不是7c00-7dff么
6. Makefile中定义简单变量: TOOLPATH = ../z_tools/
MAKE = $(TOOLPATH)make.exe -r 。引用方式: $(MAKE )
JNC :jump if not carry。
JAE:jump if above or equal.
JBE: jump if below or equal.
JB:jump if below
harib00d :将磁盘C0-H0-S2 - C0-H0-S18的512*17=8704字节读入内存。
7. 启动区512字节装载到内存地址0x7C00,他的作用是把操作系统装载到内存中。
最开始我们讲要编写一个一通电就能运行的程序。启动盘的第一个扇区是启动区(最后两字节必须为55AA),把程序代码保存到这个扇区即可,这样就是一个通电就能运行的程序。这个程序最开始我们只是在屏幕上显示一个字符串信息“Hello,world!”,最终改造为一个IPL,即把其他程序装载进入内存的程序(从磁盘读取操作系统的程序)。先写个最简单的操作系统,即显示一个字符串即可,再慢慢添加新的功能。
8. 最开始用二进制编器手动输入程序,显示一个字符串;再用汇编慢慢改造一样的效果。
(第一次改造只用:DB,SETB) (第二次改造:加入DW,DD,)(第三次改造:加入ORG,JMP,MOV等),慢慢熟悉汇编语言的同时,把程序写的简单易懂。
然后删去最后的字节,只保留512字节,成为一个启动区。再把启动区改造为可装入其他程序。ipl10.bin 读入10个柱面放入内存。
9. 第三天,完成了启动区的制作,下一步开始编写操作系统代码。
最简单的操作系统haribote.nas:
Fin:
HLT
Jmp fin
我们需要将操作系统本身的内容写到名为haribote.sys文件中,再把他保存到磁盘映像里,然后我们从启动区执行这个haribote.sys就行了。
操作系统软盘地址从0x4200开始,磁盘内容装载到0x8000地址,相加即为内存地址 0xc200;
需要在haribote.nas头加入org 0xc200,在启动区最后添加代码jmp 0xc200。如此在装载完os后,即会跳到地址0xc200执行操作系统程序。
10. CPU32位模式不能调用BIOS功能。
VRAM:Video RAM,显卡内存,他的地址对应着屏幕上的像素。
10. C中调用汇编
2013-12-23