陈奇网络工作室

操作系统-主引导程序控制权的转移

系统运维

一。主引导程序控制权的转移

首先需要了解的是引导装载程序内存布局,在嵌入式操作系统中,引导加载程序是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像基本输入输出系统那样的固件程序(注,有的嵌入式中央处理器也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由引导装载程序来完成。在一个基于ARM7TDMI内核的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的引导装载程序程序。

0x7c00主引导程序的起始地址,之前为栈空间,主要是函数调用。最终主引导程序是从靴子程序跳转到0x9000loader,中间部分为脂肪表,占用四个字节

1.通过文件分配表(文件分配表)表加载文件内容流程图

实验步骤

1.在虚拟软盘中创建体积较大的文本文件(装载机)

2.将装货设备的内容加载到BaseofLoader地址处

3.打印装货设备中的文本(判断加载是否完全)

组织0x7c00

jmp短期启动

未另行规定除非另有规定

定义:

BaseOfStack equ0x7c00

BaseOfLoader equ0x9000

RootEntryOffset equ 19

RootEntryLength equ 14

EntryItemLength equ 32

FatEntryOffset equ 1

FatEntryLength equ 9

标题:

BS_OEMName db D.T.Soft

BPB_BytsPerSec dw 512

BPB _秒percus db 1

BPB_RsvdSecCnt dw 1

BPB_NumFATs db 2

BPB _根区dw 224

BPB _托特克16图纸2880

BPB _媒体数据库0xF0

BPB _法茨兹16 dw 9

BPB第二大道dw 18号

BPB_NumHeads dw 2

BPB_HiddSec dd 0

BPB_TotSec32 dd 0

BS_DrvNum db 0

BS_Reserved1 db 0

BS_BootSig数据库0x29

BS_VolID dd 0

BS_VolLab db D.T.OS-0.01

BS _文件系统类型数据库FAT12

开始:

移动ax,cs

移动ss,ax

移动ds,ax

移动,斧

mov sp,BaseOfStack

mov ax,RootEntryOffset

mov cx,RootEntryLength

mov bx,Buf

调用读取扇区

移动是的,目标

塔伦mov cx

mov dx,0

调用FindEntry

cmp dx,0

塞尔维亚-克罗地亚语缩写输出

mov si,bx

入口运动

mov cx,EntryItemLength

呼叫MemCpy

mov ax,FatEntryLength

mov cx,[BPB_BytsPerSec]

mul cx

mov bx,BaseOfLoader

子bx,ax

移动斧头,FatEntryOffset

mov cx,FatEntryLength

调用读取扇区

mov cx,[EntryItem0x1A]

mov si,BaseOfLoader

加载:

mov ax,dx

添加ax,31

mov cx,1

推送高级的(deluxe的简写)

推送布朗克斯(Bronx)

mov bx,si

调用读取扇区

pop bx

流行cx

呼叫FatVec

cmp dx,0xFF7

jnb BaseOfLoader

添加si,512

jmp加载

输出:

mov bp,MsgStr

mov cx,MsgLen

呼叫打印

最后:

停止

jmp最后

;cx指数

;bx脂肪表地址

;返回:

;dx-fat索引]

FatVec:

mov ax,cx

mov cl,2

分类厘升

推斧

mov ah,0

mov cx,3

mul cx

mov cx,ax

爆破筒

cmp ah,0

jz even

jmp奇数

甚至:Fat vec[j]=((Fat[I 1]0x0F)8)| Fat[I];

mov dx,cx

添加dx,1

添加dx,bx

移动bp,dx

mov dl,字节[bp]

和dl,0x0F

shl dx,8

添加cx,bx

mov bp,cx

或dl,字节[bp]

jmp返回

奇数:Fat vec[j 1]=(Fat[I 2]4)|((Fat[I 1]4)0x0F);

mov dx,cx

添加dx,2

添加dx,bx

移动bp,dx

mov dl,字节[bp]

mov dh,0

shl dx,4

添加cx,1

添加cx,bx

mov bp,cx

mov cl,字节[bp]

shr cl,4

和C1,0x0F

移动通道,0

或者dx,cx

返回:

浸水使柔软

;ds:硅源

;埃斯:迪-目的地

;cx -长度

内存:

推送大音阶第七音

推目的地想象

推送cx

推斧

cmp si,di

ja btoe

添加si、cx

添加di、cx

十二月四日

十二月二日

jmp etob

btoe:

cmp cx,0

塞尔维亚-克罗地亚语缩写完成

mov al,[si]

mov字节[迪],铝

公司si

公司di

十二月cx

jmp btoe

etob:

cmp cx,0

jz完成

mov al,[si]

mov字节[di],al

十二月四日

十二月二日

十二月cx

jmp etob

完成:

爆破筒

流行cx

波普迪

波普斯

浸水使柔软

;es:bx -根条目偏移地址

;ds:si目标字符串

;cx -目标长度

;返回:

;(dx!=0 ) ?存在:不存在

;exist - bx是目标条目

FindEntry:

推di

推送bp

推送cx

mov dx,[BPB _根中心]

移动bp,sp

查找:

cmp dx,0

jz不存在

mov di,bx

mov cx,[bp]

调用MemCmp

cmp cx,0

jz存在

添加bx,32

十二月十日

jmp查找

存在:

不存在:

流行cx

流行血压

波普迪

浸水使柔软

;ds:硅源

;es:di -目的地

;cx -长度

;返回:

;(cx==0)?相等:不相等

MemCmp:

推送si

推di

推斧

比较:

cmp cx,0

jz等于

mov al,[si]

cmp al,字节[di]

jz呆子

jmp noequal

呆子:

公司si

公司di

十二月cx

jmp比较

相等:

不相等:

爆破筒

波普迪

波普斯

浸水使柔软

;es:bp -字符串地址

;cx -字符串长度

打印:

mov dx,0

mov ax,0x1301

mov bx,0x0007

int0x10

浸水使柔软

;没有参数

ResetFloppy:

推斧

推送dx

mov ah,0x00

mov dl,[BS_DrvNum]

int0x13

流行dx

爆破筒

浸水使柔软

;ax -逻辑扇区号

;cx -扇区数

;es:bx -目标地址

读取扇区:

推送bx

推送cx

推送dx

推斧

调用ResetFloppy

推送bx

推送cx

mov bl,[BPB _塞克]

div bl

mov cl,ah

添加cl,1

电影频道

shr ch,1

mov dh,al

和dh,1

mov dl,[BS_DrvNum]

爆破筒

pop bx

mov ah,0x02

阅读:

int0x13

jc读取

爆破筒

流行dx

流行cx

pop bx

浸水使柔软

MsgStr数据库无加载程序.

MsgLen equ ($-MsgStr)

目标数据库加载程序

TarLen equ($-目标)

EntryItem乘以EntryItemLength db0x00

Buf:

乘以510-($-$$) db0x00

数据库0x55,0xaa

制造这个的结果。

从结果中可以看出,TIME的值为负,这意味着主引导程序的大小大于512,所以我们需要将其缩小,删除之前不重要的操作,以免占用空间。那么我们之前为什么要这么做呢?为了符合汇编代码的约定,操作相关寄存器的值必须放入堆栈并从堆栈中取出。然后我们的内存不够,就不需要这个操作了。我们会删除下面的栈入和栈出操作,但是会保留FindEntry函数中cx寄存器的栈入和栈出操作,因为下面cx寄存器的值是不断变化的。在查找操作中,需要在调用MemCmp操作之前和之后添加si寄存器的堆栈入和堆栈出操作。

在bochs上得到的正确的make和结果将在加载器中打印字符串内容。

B.第一个加载程序

1.起始地址0x9000

2.通过int0x10打印屏幕上的字符串。

A.零标志位确定运算结果是否为0,当运算结果为0时,ZF位的值为1。

B jxx代表一个指令族,它的作用是根据标志位进行调整。

OF为1时Jo跳,CF为1时jc跳,SF不为1时jns跳,ZF为1时jz跳,je比较结果相等。

loader.asm代码的实现

组织0x9000

开始:

移动si,消息

打印:

mov al,[si]

添加si,1

cmp al,0x00

我结束了

mov ah,0x0E

mov bx,0x0F

int0x10

jmp打印

结束:

停止

jmp结束

消息:

数据库0x0a、0x0a

db你好,D.T.OS!

数据库0x0a、0x0a

db0x00

反编译loader.asm的结果

可以看到这里的jz对应于loader.asm中的je命令

接下来,将加载程序复制到软盘,然后从引导跳转到加载程序执行。我们首先在linux中挂载虚拟软盘,然后复制,最后运行。

从打印结果可以看出,控制权已经从引导转移到加载程序。

修改打印结果,查看bochs上的执行结果是否也被修改。

在这里我们需要将生成文件文件进行修改保证后期的运行简便。假的:完全重建

BOOT_SRC :=boot.asm

BOOT_OUT :=引导

LOADER_SRC :=loader.asm

LOADER_OUT :=loader

IMG :=data.img

IMG _路径:=/mnt/hgfs

RM :=rm -fr

所有:$(IMG) $(引导_输出)$(加载_输出)

@回声构建成功==D.T.OS!

$(IMG):

bximage $@ -q -fd -size=1.44

$(BOOT_OUT) : $(BOOT_SRC)

nasm $^ -o $@

DD if=$ @ of=$(IMG)bs=512 count=1 conv=not runc

$(LOADER_OUT) : $(LOADER_SRC)

nasm $^ -o $@

须多山表示“具有…性质的”环线$(IMG)$(IMG _路径)

sudo cp $@ $(IMG路径)/$@

sudo umount美元(IMG _路径)

清洁:

$(RM)$(IMG)$(BOOT _ OUT)$(LOADER _ OUT)

重建:

@$(使)干净

@$(MAKE)全部

最后将data.img在窗户下实现

小结

1.靴子需要进行重构保证在512字节内完成功能

2.在汇编程序中尽量确保函数调用前后通用寄存器的状态不变

3.靴子成功加载装货设备后将控制权转移

4.装货设备程序没有代码体积上的限制

更多关于云服务器,域名注册,虚拟主机的问题,请访问西部数码代理商官网:www.chenqinet.cn

相关推荐

后台-系统设置-扩展变量-手机广告位-内容页底部广告位3