现在的位置: 首页 > 综合 > 正文

《30天自制操作系统》第3天

2017年11月29日 ⁄ 综合 ⁄ 共 1579字 ⁄ 字号 评论关闭

1. 进入32位模式并导入C语言

制作真正的IPL(启动程序加载器)-用他来装载程序

BIOS 0x13号函数(INT 0x13)读写磁盘。将硬盘内容装入内存。

JC error jump if carry,如果有进位标志则跳转到error

2. 软盘就像一棵树的截面,他有上下两面,向上的面用磁头0读写,下面用磁头1读写。

树有很多年轮,软盘也类似,软件年轮之间的部分叫柱面(cylinder),上下各有80个柱面,最外是柱面0,再是柱面1,。。。一直到最里面的柱面79,下面也是一样。每个柱面又分18个扇区sector1-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

JAEjump if above or equal. 

JBE:  jump if  below or  equal. 

JBjump if  below 

harib00d :将磁盘C0-H0-S2 - C0-H0-S18512*17=8704字节读入内存。

7. 启动区512字节装载到内存地址0x7C00,他的作用是把操作系统装载到内存中。

最开始我们讲要编写一个一通电就能运行的程序。启动盘的第一个扇区是启动区(最后两字节必须为55AA),把程序代码保存到这个扇区即可,这样就是一个通电就能运行的程序。这个程序最开始我们只是在屏幕上显示一个字符串信息“Helloworld!”,最终改造为一个IPL,即把其他程序装载进入内存的程序(从磁盘读取操作系统的程序)。先写个最简单的操作系统,即显示一个字符串即可,再慢慢添加新的功能。

8. 最开始用二进制编器手动输入程序,显示一个字符串;再用汇编慢慢改造一样的效果。

(第一次改造只用:DBSETB) (第二次改造:加入DWDD,)(第三次改造:加入ORGJMPMOV等),慢慢熟悉汇编语言的同时,把程序写的简单易懂。

然后删去最后的字节,只保留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

抱歉!评论已关闭.