0%

《Orange'S:一个操作系统的实现》笔记

磁盘镜像

主要使用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-前缀。

软盘操作问题

无法使用mountumount之类的命令,好在可以使用Mac自带的磁盘工具打开软盘,将文件拷贝进去。

参考

如何调试操作系统
GNU Linker equivalent command in OS X