前言
现在闲下来,开始学linux0.12.
给自己定的学习目标是:实验在真机+U盘上可以运行, 这样才有满足感:)
看其他同学,包括书上,都是在bochs下做实验。这样不能在真机上跑的实验,意义不大。
以前有段时间特别的闲, 玩过一个月的nasm, 写的bootloader在bochs和真机(插入载有bootloader的U盘)上都能跑。
照着书上最初的boot.s, 编译出来的bin, 写入镜像和U盘后,只在bochs2.6.9中能运行,在真机+U盘上不能运行。bochs真假:(
同样的汇编源码,用nasm和as86都写了一次,语义相同。但是用nasm和as86+ld86生成的汇编代码不一样(用bc4进行2进制比较)。明天用bochsdbg再查一下汇编代码的区别。
如果真是as86+ld86生成的代码不能在真机上跑,我决定找新版本的as系列编译器或用nasm重写as86版的代码(不同家的汇编,看起来都差不多,语法上稍有区别。改起来应该不是很难)。
今天做的实验,只能说明as86+ld86的编译过程,没有其他意义了。
实验
编译环境 :debian9 + as86 + ld86
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 start with 16-bit code segment, warn for all instructions > 8086
! -1 start with 16-bit code segment, warn for all instructions > 80186
! -2 start with 16-bit code segment, warn for all instructions > 80286
! -3 start with 32-bit code segment, don't warn for any instructions. (not even 486 or 586)
! -l => 显示列表文件
!
! ld86参数的含义
! -0 produce header with 16-bit magic
! -3 produce header with 32-bit magic
! -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 -2 -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 = 0x7c00
entry start
.org 0
start:
! jmpi go, BOOTSEG
! go:
mov ax, cs
mov ds, ax
mov es, ax
! org code
! mov [msg1+17], ah
! mov cx, #20
! mov dx, #0x1004
! mov bx, #0x000c
! mov bp, #msg1
! mov ax, #0x1301
! code transplant from nasm
! show "666666" on monitor
mov bh, #0
mov bl, #0x47
mov cx, #8
mov al, #0x36 ! '6' is 0x36
mov ah, #9
int 0x10
loop0:
jmp loop0
! msg1:
! .ascii "Loading system ..."
! .byte 0x0d, 0x0a
.org 510
.word 0xAA55
.text
endtext:
.data
enddata:
.bss
endbss:
编译的脚本
#!/bin/sh
# @file D:\my_svn_checkout\my_svn_rep_2019\old_linux\src\3.1.2\build_as86_asm_on_debian.sh
rm ./boot
rm ./*.o
rm ./boot_512b
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