操作系统实践-2 从硬盘中读取代码并执行

操作系统实践-2 从硬盘中读取代码并跳转执行

1.从硬盘中读取数据的中断介绍

使用0x13号中断时,寄存器作用见下表

寄存器数字作用
AH0x02方向:磁盘 > 内存
ALNum读入Num个扇区
CHNum第Num个柱面
CLNum第Num号扇区
DHNum磁头号
DLNum驱动器号
ES
BX偏移
标志寄存器成功则jnc

2.从硬盘中读取next.s并跳转至其执行,显示"Now we are in next."

2.1改写bootsect.s

!从bootsect.s跳转至next.s
NEXT_LEN = 2!目标程序占几个扇区,这里其实是1个,手滑写成了2,不过无所谓
NEXT_SEG = 0x07e0!目标程序被读入后在内存的地址
entry _start
_start:
    mov ah,#0x03        
    xor bh,bh
    int 0x10
    mov cx,#27              
    mov bx,#0x0007     
    mov bp,#msg1
    mov ax,#0x07c0
    mov es,ax
    mov ax,#0x1301   
    int 0x10
load_next:
	mov dx,#0x0000
	!DH:磁头 DL:驱动器号
	mov cx,#0x0002
	mov bx,#0x0200
	!读取磁盘所得放在es:bx后面
	mov ax,#0x0200 + NEXT_LEN
	!AH=02参数,表示方向是从磁盘读取至内存
	int 0x13
	jnc ok_load_next!如果读取成功
	mov dx,#0x0000
	mov ax,#0x0000
	int 0x13
	jmp load_next
ok_load_next:
	jmpi 0,NEXT_SEG
msg1:
    .byte   13,10                     
    .ascii  "My os is Loading--LMC"
    .byte   13,10,13,10               
.org 510
boot_flag:
    .word   0xAA55!硬盘标志位,表示可以用

2.2创建next.s

entry _start
_start:
    mov ah,#0x03        
    xor bh,bh
    int 0x10
    mov cx,#25              
    mov bx,#0x0007     
    mov bp,#msg2
    mov ax,cs
    mov es,ax
    mov ax,#0x1301   
    int 0x10
inf_loop:
    jmp inf_loop  
msg2:
    .byte   13,10                     
    .ascii  "Now We are in Next."
    .byte   13,10,13,10               
.org 510
boot_flag:
    .word   0xAA55!硬盘标志位,表示可以用

2.3编写Makefile文件

由于有两个文件需要编译,链接,写个Makefile方便一些,这里用Python写了个build.py用来生成镜像

all:Image
Image : bootsect next
	python build.py
bootsect : bootsect.o
	ld86 -0 -s -o bootsect bootsect.o
next : next.o
	ld86 -0 -s -o next next.o
bootsect.o : bootsect.s
	as86 -0 -o bootsect.o bootsect.s
next.o : next.s
	as86 -0 -o next.o next.s

2.4用Python编写build.py

bootsect = open("bootsect","rb")
bin_sect = bootsect.read(32)
bin_sect = bootsect.read(512)#binsect为512字节的引导扇区
bootsect.close()
next_s = open("next","rb")#不用next,因为next是python关键字
bin_next = next_s.read(32)#去除头
bin_next = next_s.read()
next_.close()
f = open("Image","wb+")
f.write(bin_sect + bin_next)#合成
f.close()

2.5执行make命令

make

2.6加载到Bochs中执行

bochs

3.总结

从内存中的A.s跳到硬盘中的B.s执行要经历以下步骤:

  1. 在A.s中把B.s读到内存中一个精确的位置,记为C
  2. 在A.s中用jmp命令把PC指向C即可
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值