Linux内核完全注释:第三章 内核引导启动程序-bootsect.s讲解

内核引导启动程序

文件结构

在这里插入图片描述

知识补充

BIOS:

  • 计算机启动最开始执行的BIOS程序,BIOS(Basic Input Output System).
  • 是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息

结合boot/目录下程序讲解计算机启动流程

  • PC的电源开机后,80x86结构的CPU自动进入实地址模式。
  • 执行从0xFFFF0开始的程序,一般就是BIOS,再次映证BIOS是计算机启动第一个执行的程序。
  • BIOS将执行系统的检测,并在物理地址0处开始初始化中断向量,这里的中断向量是BIOS中断
  • 将软盘或硬盘的第一个扇区(512字节)读入内存绝对地址为0x7C00处,并跳转到这个地方。

小结:BIOS是计算机加电后第一个执行的程序,BIOS执行完毕后会加载第一个扇区的程序到0x7C00处继续执行,这里的第一个扇区存放boot/bootsect.s,其功能下面进行讲解。

程序分析

bootsect.s(8086汇编)

  1. 首先理解下文件名:其名为bootsect.s,后缀名表示其为汇编程序,那么bootsect的含义呢?boot表示启动,sect是section的缩写,表示扇区,即bootsect是启动扇区的含义。
  2. 上面说到,BIOS执行完后会将bootsect.s加载到0x7c00处,然后开始执行bootsect.s,下面分析bootsect.s程序,不要怕,就是简单的汇编,我们日常作业写的汇编都比这难,只不过这里涉及一些硬件相关的知识和BIOS的中断调用。
功能描述:

BIOS int 0x13中断理解
简单来说:该中断将指定扇区的代码加载到内存指定位置,其本质是磁盘服务程序。

  • 将自己移动到内存0x90000处,并跳转到0x90000
  • 利用BIOS的int 0x13,将setup.s模块加载到0x90200处
  • 利用BIOS的int 0x13(上面说过,BIOS从物理地址0处设置中断向量)取磁盘参数表中当前启动引导盘的参数
  • 将system模块(链接生成的文件镜像),从磁盘加载到内存0x10000开始的地方
  • 设置根文件系统
  • 长跳转到setup程序,执行setup.s程序

提问:上面提到0x90000, 0x90200,0x10000,为什么非得是这三个地址呢?不能是其他吗?看下面一张程序分布图(提示:三个地址是根据每个程序的大小来定的, 0x200B == 512B == 一个扇区大小):
在这里插入图片描述

源码解析

由于源码篇幅比较大,我不会将所有源码贴进来,建议读者去下载本系列博客目录提供的书籍资料,以及源码压缩包,然后配合本博客一起读,笔者使用VSCode(安装x86 and x86_64 Assembly插件)阅读汇编代码。

  1. 数据以及标识符声明部分:
    !
    ! SYS_SIZE is the number of clicks (16 bytes) to be loaded.
    ! 0x3000 is 0x30000 bytes = 196kB, more than 
  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值