《操作系统真象还原》第二章 编写MBR主引导程序

2.1 计算机启动过程


我们开机的时候,第一个运行的软件是bios(Base input & output system)即基本输入输出系统。
1、他是由谁加载的?
2、它被加载到哪里?
3、它的cs:ip是谁来改写?
Bios建立了中断向量表,可以通过“int中断号”来实现相关的硬件调用,也就是对硬件的Io操作。
首先我们要知道地址总线是映射Rom、外设内存或物理内存的,而不是所有都是物理内存,电脑会先为ROM,外设内存预留一些地址空间,再对物理内存进行映射
Bios存放在只读存储器ROM(ROM存储一成不变的数据),存放Bios这个ROM被映射在低端1MB内存的顶部,即地址0xF0000~0xFFFFF处
CPU访问内存时用段地址+偏移地址来实现的,在实模式下物理地址是段地址乘以16后与偏移地址相加得到的。Intel 80x86系列的CPU可以分别在16位实模式和32位保护模式下运行。为了解决启动问题,将硬件设计为——加电即进入16位实模式状态运行。在开机的瞬间,强行将CS的值置为0xF000,IP的值置为0xFFF0,这样CS:IP就指向了0xFFFF0这个地址(即bios程序的入口地址),值得注意的是实模式下只能访问1MB的内存,也就是0xFFFF0~0xFFFFF中的这16个字节,这说明bios的真正的地址并不在这里。
在0xFFFF0处的是一个跳转指令jmp far f000:e05b,0xfe05b处是bios代码真正执行的地方,接下来bios检测内存,显卡等外设信息,当检测通过,并初始化好硬件,开始在内存中0x000~0x3FF处建立数据结构,中断向量表IVT并填写中断例程。
bios的最后一项工作是,校验启动盘中位于0盘0道1扇区的内容(磁盘上做开始的那个扇区)。


2.2 BIOS


1、为什么是0盘0道1扇区的内容?
2、为什么是0x7c00?
位于0盘0道1扇区可能是规定->方便寻找,因为mbr程序是由末尾的魔数来判定的(0x55和0xaa),若次扇区末尾是这两个魔数,则会被加载到0x7c00,随后跳转到此地址,继续执行。
0x7c00是由于当时的计算机只有32k,mbr虽然只有512字节,但是还是要预留栈的空间,所以吧32最后1k给mbr,32k转换为16进制为0x8000,减去1k为0x7c00。


2.3让MBR先飞一会


MBR的大小必须为512字节,这是为了保证0x55和0xaa这两个魔数恰好出现在改善去的最后两个字节处。
$和$$是NASM预留的关键字,是用来表示当前行和本section的地址,section是用来在逻辑上规划代码用的
bin是纯二进制代码,elf不是纯二进制代码

bios中的代码不必深究,用的不多

2-1 mbr.s代码

SECTION MBR vstart=0x7c00 ;MBR程序地址0x7c00
mov ax,cs	;由于cs为0,,所以可以用cs来初始化ax
mov ds,ax
mov es,ax
mov ss,ax
mov fs,ax
mov sp,0x7c00

;利用INT 0x10 功能号:0x06来上卷全部行
mov ax, 0x0600	;AH 功能号 = 0x06 AL = 行卷的行数(0表示全部)
mov bx,0x0700	;BH表示上卷行属性,属性是指背景色 
mov cx,0x0000	;cx=(CL,CH)=窗口左上角的(X,Y)
mov dx,0x184f	;右下角(80,25)VGA文本模式,一行80个字符,一共25行
     ;下标从0开始,所以0x18=24,0x4f=79
int 0x10

mov ax,0x0300	
	mov bx,0x0000	
	int 0x10

mov ax,message
mov bp,ax
mov ax,0x1301 	
mov bx,0x0007	;设置字体属性,02是黑底绿字,07是黑底白字 	
mov cx,0x000a	;串长度,这里为10个
int 0x10 	 	

jmp $ 	
message db "Hello MBR!" 	
times 510-($-$$) db 0 	
db 0x55,0xaa

编译代码 nasm -o mbr.bin mbr.S

使用dd指令写入虚拟机磁盘:dd if=/your_path/mbr.bin of=/your_path/bochs/hd60M.img bs=512 count=1 conv=notrunc

if-指定要读取的文件

of-指定吧数据输出到哪个文件

bs-指定块的大小

count-指定靠背的块数

seek-吧块输出到文件时要跳过多少块

conv-指定如何转换文件,最好使用notrunc方式,也就是不打断文件

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值