三十天自学操作系统读后感2

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抠出来,放下电。


如果有错,欢迎指出。

邮箱:ningmonguo@foxmail.com

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值