磁盘镜像
主要使用bximage
这个工具。
bximage # 选择1,其次fd
使用dd
工具将讲boot.bin
写入到软盘的第一个扇区,作为引导用。
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
将数据拷贝到镜像的方法
sudo mount -o loop xxx.img /mnt/floppy # 挂载,挂在失败的话在mnt目录下创建floppy文件夹
sudo cp xxx.com /mnt/floppy/ -v # 拷贝文件
sudo umount /mnt/floppy # 卸载
编译
我是在Ubuntu 20.04.2 LTS
环境下编译
64位的问题
nasm -f elf32 foo.asm -o foo.o # NASM编译成ELF32位目标文件
gcc -m32 -g -c bar.c -o bar.o # GCC编译成32的目标文件
ld -m elf_i386 foo.o bar.o -o foobar # 链接目标文件,生成执行文件
编译C问题:undefined reference to '__stack_chk_fail'
,需要在编译时加上参数-fno-stack-protector
。
gcc -m32 -g -c -fno-stack-protector bar.c -o bar.o # 例子
代码
编译第5章代码时,出现disp_str
第二遍调用后报错的问题,网上找到的可以正常的代码。
; ========================================================================
; void disp_str(char * info);
; ========================================================================
disp_str:
push ebp
push esi
push edi
push eax
push ebx
mov ebp, esp
mov esi, [ebp + 24] ; pszInfo
mov edi, [disp_pos]
mov ah, 0Fh
.1:
lodsb
test al, al
jz .2
cmp al, 0Ah ; 是回车吗?
jnz .3
push eax
mov eax, edi
mov bl, 160
div bl
and eax, 0FFh
inc eax
mov bl, 160
mul bl
mov edi, eax
pop eax
jmp .1
.3:
mov [gs:edi], ax
add edi, 2
jmp .1
.2:
mov [disp_pos], edi
pop ebx
pop eax
pop edi
pop esi
pop ebp
ret
使用FreeDOS运行COM
FreeDOS运行COM文件记录,主要是拷贝软盘里面,然后执行。
sudo mount -o loop xxx.img /mnt/floppy # 挂载,挂在失败的话在mnt目录下创建floppy文件夹
sudo cp xxx.com /mnt/floppy/ # 拷贝文件
sudo umount /mnt/floppy # 卸载
网上书中的源码中的freedos.img
并不包含debug
这样的工具,不过debug
并不能调试保护模式的代码。
在bochsrc
配置文件中添加
magic_break: enabled = 1
最后在汇编代码需要断点的地方添加
xchg bx, bx
在FreeDOS执行COM文件后,就会进入到bochs调试。
Bochs
需要注意的是执行bochs
命令后,需要输入c
,我第一次执行完毕后发现为什么没有画面呢?
调试命令
sreg # 显示段寄存器的内容
info gdt # 显示GDTR寄存器的内容
creg # 显示CR0寄存器的内容
print-stack # 查看栈的内容
Mac OS问题
编译
当使用make
编译代码时会报ld: unknown option: -Ttext
的错误,查了下Mac下的ld没有这个功能选项,一种是在虚拟机下编译,另一种是使用brew安装i386-elf-toolchain
brew tap nativeos/i386-elf-toolchain
brew install i386-elf-binutils i386-elf-gcc
安装完后需要讲Makefile文件中对应gcc以及ld都添加i386-elf-
前缀。
软盘操作问题
无法使用mount
或umount
之类的命令,好在可以使用Mac自带的磁盘工具打开软盘,将文件拷贝进去。