前言
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盘,显示"磁盘未初始化,是否现在格式化"。