NO.2
0,回顾
上次完成了最简单操作系统的代码,按下开机键后界面展示hello world
基本知识点,操作系统编码地址内存冲0开始,0 到 7c00之前存着bios的相关功能,中断功能等等。开机以后自动执行bios,bios进行检查与及相关功能的初始化、把对应的程序装载到内存中。bios通过每个扇区512字节的末尾0x55aa判断该扇区是否该装进内存。装载完了最后就跳到 0x7c00处执行。day01中在该处写了个展示hello world程序。接下来说内存编址,内存00到ff是只读内存,这些是芯片,然后ff--ffff...才是真的内存条。
然后之前也没有说明org指令的意义。 ORG是Origin的缩写:起始地址,源。在汇编语言源程序的开始通常都用一条ORG伪指令来实现规定程序的起始地址。如果不用ORG规定则汇编得到的目标程序将从0000H开始。 然而放不进去的,0处是芯片地址,这个地方是rom只读,没办法写会出错。
接下来事上节没有搞清楚的内容,计算通电后冲内存0开始执行,内存控制器第一件事就是从芯片上执行,执行完了到内存07c00出开始,这里我们要写装载程序,就是把读取硬盘的程序写在这里,程序执行完的时候,下一个地方就是执行操作系统,这个操作系统就是之前的读取程序都进来的。那么考虑当年的内存很小。然后在这个小内存里面就写读盘程序,把他读到对应的地方去,内存都会被编址的,编址了就会跑到,如果操作系统里面不写循环,我猜跑到最后一个地址也就完了。
2,读盘
这次实现的程序是读盘操作。
首先最简单的读盘操作
mov ax,0x0820
mov es,ax ; 习惯使用es作为目的地址的段地址,因为这里要复制
mov ch,0 ; 柱面 0
mov dh,0 ; 磁头 0
mov cl,2 ; 扇区 2
mov ah,0x02 ; ah=02 : 读盘
mov al,1 ; 1个扇区
mov bx,0
mov dl,0x00 ; A驱动器
int 0x13 ; 调用磁盘bios
jc error ; 条件跳转error
如上,指定es的位置,习惯使用es作为目的地址的段地址,因为这里要复制。本次中使用es:bx表示具体目的段地址。后面就是设置相关寄存器的值,然后执行中断去读盘。
循环执行以上过程,就会把硬盘上的操作系统读进内存,然后cpu就是老老实实从内存0地址开始执行,bios,然后读盘,读取完毕以后执行跳转,调转到操作系统的地址开始执行。
接下来写下完整的磁盘函数:
读磁盘
mov ax,0x0820
mov es,ax
mov ch,0 ; 柱面0
mov dh,0 ; 磁头0
mov cl,2 ; 扇区
readloop:
mov si,0 ; 记录失败次数的寄存器
retry:
mov ah,0x02 ; ah=0x02 : 读入磁盘
mov al,1 ; 1个扇区
mov bx,0
mov dl,0x00 ; A驱动器
int 0x13 ; 调用磁盘bios
jnc next ; 没出错时跳转到next
add si,1 ; si加1
cmp si,5 ; 比较si与5
jae error ; si >= 5 时候,跳转error , 重试 5 次 都失败 报错
mov ah,0x00
mov dl,0x00 ; A驱动器
int 0x13 ; 重置驱动器
jmp retry
next:
mov ax,es ; 把内存地址往后移动 0x200
add ax,0x0020
mov es,ax ; 因为没有 add es,0x020指令,所以这里稍微绕个弯儿
add cl,1 ; cl 加1
cmp cl,18 ; 比较cl 与 18
jbe readloop ; 如果cl <= 18,则跳转回去readloop
mov cl,1
add dh,1
cmp dh,2
jb readloop ; 如果 dh < 2 跳回去 readloop
mov dh,0
add ch,1
cmp ch,cyls
jb readloop ; 如果dh < cyls, 则跳转到readloop `这里的cyls 箱单是 10 是个宏定义
这个读盘程序位于什么地方呢?显然 他应该位于MBR中,MBR被称为主引导程序,那么主引导程序是什么时候被读入内存的呢?这个过程之前介绍过只是没有意识到,biso通过55aa判断主引导程序,MBR只有 512 个字节,因此,MBR一般唯一磁盘的第一个扇区,这个扇区里面有分区表,就是磁盘分多少个区,然后就是读盘程序,和跳转程序,从第二个扇区开始读取,一般又这个磁盘上的程序决定读取多少内容,读取完毕以后,一行跳转命令跳到操作系统其实位置,开始执行操作系统。这一块算是搞懂了。
然后突然想到一个问题,为什么计算机会在启动的时候按下f2就能进入bios管理界面,这个很奇怪呀。通过不懈努力,终于在知乎上找到了答案,是说开机的时候bios会有1个三到五秒等待键盘命令,这个等待是可以取消的,如果通过bios管理取消了,那么计算机以后开机都没有这些过程了,然后就没有办法进入bios管理界面了,如果想要进入,只能重置bios,就是把bios抠出来,放下电。
如果有错,欢迎指出。