linux0.12 - boot.s

前言

bochs环境搭好了, 换个0扇区的代码,看看在bochs和U盘上是否都能正常运行。

编译boot.s

!
! @file D:\ls\study\linux_prj\old_linux\src\3.1.2\boot.s
! @brief
!
! 编译环境: debian9.6
! 系统自带的as, ld无法编译16位的boot代码
!
! 安装as86, ld86
! apt-get install bin86
!
! as86 -v
! as86 version: 0.16.17
!
! ld86 -v
! ld86 version: 0.16.17
!
! as86的帮助 => man as86 => 翻页用page_up page_down, 
! 在SecureCRT中还是用上下箭头来翻页吧,虽然看的有点晕(用page_up, page_down, 翻到man之外了)
!
! as86参数的含义
! 	-0 => cpu为8086
! 	-l => 显示列表文件
! 
! ld86参数的含义
!	-0 => cpu为8086
!	-s => 去掉符号
!
! 编译出来的./boot比512多出了32bytes的minix头, 用dd命令去掉
! dd命令参数的含义
!	bs=1 块大小为0
!	skip=32 跳过32个块
!	if=./boot 指定输入文件
!	of=./boot_512b 指定输出文件
! dd命令执行完的验证
!	用bc4比较./boot和./boot_512, 可以看到./boot_512内容和./boot后面的512字节内容相同
!
! 编译源码
! rm ./*.o ./boot
! as86 -0 -l -o ./boot.o ./boot.s
! ld86 -0 -s -o ./boot ./boot.o
! dd bs=1 skip=32 if=./boot of=./boot_512b

.globl begtext, begdata, begbss, endtext, enddata, endbss

.text
begtext:

.data
begdata:

.bss
begbss:

.text
BOOTSEG = 0x07c0

entry start
start:
	jmpi go, BOOTSEG
go:
	mov ax, cs
	mov ds, ax
	mov es, ax
	mov [msg1+17], ah
	mov cx, #20
	mov dx, #0x1004
	mov bx, #0x000c
	mov bp, #msg1
	mov ax, #0x1301
	int 0x10
loop0:
	jmp loop0

msg1:
	.ascii "Loading system ..."
	.byte 0x0d, 0x0a

.org 510
	.word 0xAA55

.text
endtext:

.data
enddata:

.bss
endbss:


替换bochs镜像

用winhex19.6将boot_512内容换到udisk_33mb.img的0~512字节.

在bochs中运行

echo off
rem @file D:\ls\study\linux_prj\old_linux\src\3.1.2\run.bat
cd "D:\ls\study\linux_prj\old_linux\src\3.1.2"
"C:\Program Files (x86)\Bochs-2.3.6\bochs" -q -f .\my_bochsrc.bxrc

在这里插入图片描述

替换U盘镜像

用winhex将udisk_33mb.img的0~512内容替换到U盘0扇区。找个本本插上,开机用U盘启动,看看效果。
替换完U盘的0扇区,拔插一下,在win10中能显示U盘,但是双击已经进不去了。
将U盘插入winxp的本本,双击U盘,显示"磁盘未初始化,是否现在格式化"。

猜你喜欢

转载自blog.csdn.net/LostSpeed/article/details/87002268