系统运维
一。主引导程序控制权的转移
首先需要了解的是引导装载程序内存布局,在嵌入式操作系统中,引导加载程序是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像基本输入输出系统那样的固件程序(注,有的嵌入式中央处理器也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由引导装载程序来完成。在一个基于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