三十天自学操作系统读后感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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于哪个视频是最好的Linux操作系统自学教程,这个问题没有一个确定的答案,因为每个人的学习方式和需求不同。以下是几个可以考虑的方面: 1. 网络口碑和用户评价:在选择Linux操作系统自学教程视频时,重要的是查看其他用户的评价和评论。可以通过搜索引擎、IT技术论坛或社交媒体上的讨论来了解不同视频的受欢迎程度和用户反馈。 2. 视频内容:确定视频内容是否覆盖了你感兴趣的主题和技能水平,确保视频涵盖了Linux操作系统的基本概念、常用命令、文件系统、网络配置以及系统管理等关键知识点。 3. 教学风格:不同的讲师有不同的教学风格,你可以通过观看视频片段来了解他们的教学方法和语言表达是否适合你的学习风格。 4. 更新频率和内容质量:确定视频是最近发布的并且信息是最新的,因为Linux操作系统在不断发展,所以更新的资源对于学习来说是很重要的。 5. 适合初学者的教程:如果你是初学者,可以选择那些针对初学者提供基础知识和详细解释的教程。这些教程通常会有更多的细节和步骤,以帮助你更好地理解和掌握Linux操作系统。 总之,通过自我评估和参考他人评价,你可以找到最适合你的Linux操作系统自学教程视频。与此同时,不要依赖于单一的资源,多样化的学习方式可以帮助你更全面地理解和掌握Linux操作系统

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值