【动手开发操作系统】- 0x1

0x4:NASM

  NASM:Netwide Assembler (简称 NASM)是一款基于x86架构的汇编与反汇编软件。它可以用来编写16位(8086、80286等)、32位(IA-32)和64位(x86_64)的程序。 NASM被认为是Linux平台上最受欢迎的汇编工具之一。我们将会用它来编译我们的源代码。安装方法百度有很多,我在这里不再复述,下面看看它的使用方法:

nasm -f bin [asm filename] -o [bin filename]

asm filename是源代码文件的名称,bin filename是要输出的.bin文件的名称。

0x5:VHDTool

  VHDTool是我自己开发的一个小工具,这里有到GitHub页面的超链接,大家可以去下载它的源码,再使用自己喜欢的编译器将他编译,或者直接下载程序。这个工具的作用是将我们编译出来的.bin文件写入到vhd虚拟磁盘里。用法如下:

vhdtool -x [bin filename] [vhd filename]

这会将bin filename所指定的文件,写入vhd filename,写入使用 -x 选项,工具中会让我们输入写入的开始扇区,示例如下:

也可以用它来查看二进制内容,查看二进制内容使用 -v 选项,该过程也会让我们输入查看的字节数:

0x6:第一个引导程序

  什么是引导程序?想必学过操作系统原理的朋友都了解过,这里不妨再说一下操作系统的启动过程:在我们按下开机键的那一刻起,我们的计算机系统将执行BIOS进行加电自检,之后BIOS会将硬盘或者软盘里的第一个扇区的内容加载到内存中的 0X7C00 的位置,而第一个扇区的内容,就是我们的引导程序,所以第一个扇区也被称为 主引导扇区,一般大小为 512 字节。而我们的主引导程序将会把硬盘里的操作系统加载到内存里,最后让 CPU 跳转到操作系统的内存区运行程序,我们来看一段简单的引导程序代码:

section BOOT align=16 vstart=0x7c00
main:
	mov ax, 0xb800
	mov es, ax
	mov si, string
	mov di, 0x0
	mov cx, 0x18
	
	s0:
	mov al, ds:[si]
	mov es:[di], al
	inc si
	inc di
	loop s0
	hlt
	
string: db 'H',0x07,'e',0x07,'l',0x07,'l',0x07,
		db 'o',0x07,'!',0x07, 'M',0x07,'y',0x07,
		db ' ',0x07,'O',0x07,'S',0x07,'!',0x07

	times 510-($-$$) db 0x0
	db 0x55, 0xaa

用我们的NASM编译成.bin文件后再用VHDTool写入我们上一章节的.VHD文件的第一个扇区后启动我们的虚拟机,我们会看到以下内容:

是不是感到很惊奇,我们的第一个手写引导程序就出来了!我们来好好看看这个程序,相信熟悉汇编语言的朋友对这一小段程序并不陌生。在这段代码里我们看到最后两行的代码:

times 510-($-$$) db 0x0
db 0x55, 0xaa

这段代码的意思是在最后一行代码的后面填充0,因为我们写的这个小小的程序是不会超过512字节的,但是一个引导扇区的倒数两个字节需要填入0x55,0xaa,这是一种约定,这两个字节表明了这个扇区是一个引导扇区,有兴趣的朋友可以试一试去掉这两个字节来看看它启动的效果。简言之,一个引导扇区的后两个字节一定会是0x55,0xaa。程序中先将es设置成0xb800,之后将si设置为string在段中的偏移地址,这里有一点要注意,在BIOS将我们的引导程序加载到内存中之后,它会将程序加载到0x7c00这个地址,而不是0x0这个地址,所以我们的段内的每一个标号的偏移地址需要加上0x7c00,而程序开头的vstart=0x7c00的用途就是将程序的每一个标号的偏移地址增加0x7c00,我们就不需要去手动加了,不然我们的代码就要写成这样子:

mov di, string + 0x7c00

这样一来着实是麻烦不少,vstart也就帮了我们的大忙了!而这也正是vstart的作用。而将es设置为0xb800的目的是什么意思呢?0xb8000是显存缓冲地址,写入到这里的字符将会显示在屏幕上,而0x07是字符属性,它写入字符后面的位置,从代码中我们也可以看得出,先写入字符,再写入属性,从低到高依次写入。每个字符对应一个属性,而一个屏幕内能显示2000个字符,规格是80*25,也就是每行80个字符,有25行。

posted @ 2021-06-24 18:06  Yivies  阅读(723)  评论(0)    收藏  举报