1.引导扇区制作

转载注明出处: http://www.cnblogs.com/lucasysfeng/p/4846119.html
项目地址:https://github.com/lucasysfeng/lucasOS

计算机启动过程

  第一步:读取BIOS
  按下电源按钮后,计算机首先读取一块ROM芯片,这块芯片里的程序是”基本输入输出系統”(Basic Input/Output System),即BIOS.
  第二步:硬件自检
  BIOS会检查计算机硬件是否满足运行条件,如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。
  第三步:启动顺序
  硬件检查完成后,BIOS会将控制权交给下一阶段的启动程序,注意,“下一阶段的启动程序”可能存放在硬盘中,也可能存放在CD/DVD中,或者软盘中等等,可以设置BIOS选择从哪个设备启动。
  第四步:主引导记录
  BIOS找到了“下一阶段的启动程序”所在设备,会读取该设备的第一个扇区,即读取最前面的512字节,称为主引导记录。主引导记录会告诉计算机下一步到哪里去找操作系统。
  第五步:bootloader
  计算机读取”主引导记录”前面446字节的机器码之后,运行事先安装的“启动管理器”bootloader,由用户选择启动哪个操作系统。如果你安装了多个操作系统,那么就要从这步做出选择了。
  第六步:加载内核
  好了,选择操作系统(内核)后,会加载内核,下面就交给内核去处理了。

主引导记录

  我们使用虚拟机来启动操作系统,上面的第一步和第二步我们不做,由虚拟机去完成;第三步“启动顺序”我们选择从软盘启动(我们用镜像代替,并不是真的软盘),需要对虚拟机做下设置,选择从软盘启动。下面重点来看第四步,我们写一下“主引导记录”,让BIOS读取我们写的主引导记录。


org 7c00h                     ; BIOS读入MBR后,从0x7c00h处开始执行

; 下面部分和10h有关中断,10h中断用来显示字符
mov ax, cs
mov es, ax
mov ax, msg
mov bp, ax                    ; ES:BP表示显示字符串的地址
mov cx, msgLen                ; CX存字符长度
mov ax, 1301h                 ; AH=13h表示向TTY显示字符,AL=01h表示显示方式(字符串是否包含显示属性,01h表示不包含)
mov bx, 000fh                 ; BH=00h表示页号,BL=0fh表示颜色
mov dl, 0                     ; 列
int 10h

msg: db "hello world, welcome to OS!"
msgLen: equ $ - msg           ; 字符串长度,$当前地址
times 510 - ($ - $$) db 0     ; 填充剩余部分,$$为段开始位置
dw 0aa55h                     ; 魔数,必须有这两个字节BIOS才确认是MBR

编译

nasm boot.asm -o boot.bin
ndisasm -o 0x700 boot.bin >> nboot.asm

代码解释

为什么MBR要从0x7c00h处开始执行?

  ORG是伪指令,org 7c00h是告诉编译器,下面代码装入到内存的起始地址0x7c00h处。为什么呢,这是因为BIOS读取主引导记录后,会从0x7c00h处开始执行,那么BIOS为什么会从0x7c00h这个地址开始执行,而不是其他地址呢,这一切都要从8086cpu说起。
图 8086引脚图
8086
  正如图中所示,8086cpu的地址总线宽度为20(AD0-AD19),可以传送2^20的地址信息,即可以定位1M的内存地址空间,那么这1M的内存地址空间是如何分配的呢,见下图所示(图是386的,我们目前只关心实模式即1M内存地址空间分配):

图 实模式内存地址空间分布
实模式内存地址空间分布
  看到0x7c00h了吗?0x0000h–0x7c00h这一段存的是BIOS中断向量和一些BIOS数据等,至于到底为什么以0x7c00h为界,本文不做讨论,有兴趣看这里http://www.glamenv-septzen.net/en/view/6.

int 10h
当出现int 10h中断时,表示要操作显示器了,此时AH寄存器表示如何显示,代码中的AH为13h,表示要在TTY(伪终端)显示字符,此时其他几个寄存器都有一定的含义,如下所示:

ES:BP – 显示字符串的地址  CX – 显示字符串的长度
BH – 页码          BL – 属性(若AL=00H或 01H)
DH – 行           DL – 列
AL – 显示输出方式

为什么要有0xaa55h魔数?

  BIOS检查完硬件后,会寻找下一个设备来启动计算机,BIOS找到一个设备后,会读取该设备的第一个扇区,也就是读取最前面的512个字节。如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,控制权于是被转交给”启动顺序”中的下一个设备。

制作软盘镜像,加入主引导记录 

nasm boot.asm -o boot.bin

制作一个空的软盘镜像empty.img:

dd if=/dev/zero of=empty.img bs=512 count=2880

制作一个包含主引导记录boot.bin的镜像文件lucasOS.img

dd if=boot.bin of=lucasOS.img bs=512 count=1

将empty.img中1个扇区后的数据拷贝到lucasOS.img的后

dd if=empty.img of=lucasOS.img skip=1 seek=1 bs=512 count=2879

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值