公告

Gentoo群:87709706,OS群:838664909

#1 2022-08-30 20:25:03

batsom
管理团队
注册时间: 2022-08-03
帖子: 594
个人网站

开机启动流程:

打开电源, 一通电源其实CPU已经开始工作了,CS: eip 指向 FFFF:0, 而FFFF:0处存放着一条跳转指令, 所以CPU就执行这条跳转指令

    跳转指令跳转到BIOS ROM中的程序中执行,控制权交给BIOS

    BIOS 进行硬件检测和一些程序初始化比如设置一些BIOS中断向量(16位下)

    BIOS根据硬件设置,取得第一个可开机装置(这也是我们经常装系统是需要去BIOS中设置的开机启动装置顺序)

    BIOS去开机装置中加载数据,比如硬盘或者软盘就会去读取0号柱面0号磁柱1号扇区(MBR)中的数据,加载到内存0:7c00中(同时用0x55aa作为对引导扇区的校验, 如果不是以这两个字节数据结束,数据加载失败),加载完后cs:eip指向 0:7c00(加载过程是通过调用BIOS提供的扇区读取中断程序)

    从0:7c00开始执行程序,CPU控制权从BIOS转移到开机管理程序也就是从硬盘或者软盘第一个扇区加载进来的数据,所以严格意义上说第一个程序只是一个开机管理程 序

    我们的程序调用BIOS提供的中断程序向显存中写入字符串,并传递数量,现实属性等参数

    最后调用 jmp $进入无限循环

通过这个启动流程发现其实我们写org 7c00h并不能认为将程序加载到7c00处去执行,上面7)之前全部都是硬件执行,我们控制不了,我们做的只是将数据放到确定的地 方,让硬件去读去执行,我们写org 0x7c00h 只是让编译器将其他标签的偏移地址设置正确,如果我们写成org 0x1000h,程序依然会被加载到 0:7c00处,但是 mov ax, BootMessage这句就会执行出错, 因为此时BootMessage会变成 1000h+ 1c(BootMessage和程序开头之间所有指令长度总和),但字符串实际是存在 0:7c1c处的。

离线

页脚