自己动手编写操作系统(一)-----Boot Sector

最近在看“自己动手编写操作”一书;

第一步是实现开机引导程序的编写,我用U盘代替了软盘,在制作过程中参考了网络上其他人的做法,现在将自己的制作过程写下:

本人的配置:操作系统:centos , 编译器:nasm

	org 07c00h
	mov ax, cs
	mov ds, ax
	mov es, ax
	call DispStr
	jmp $
DispStr:
	mov ax, BootMessage
	mov bp, ax
	mov cx, 16
	mov ax, 01301h
	mov bx, 000ch
	mov dl, 0
	int 10h
	ret
BootMessage:	 db "Wel to Fool OS !"
times 510-($-$$) db 0

dw 0xaa55

首先要知道的是:当机算机的电源键被按下时,同这个键相联的电信号线就会送出一个电信号给主板,主板将此电信号传给供电系统,供电系统开始工作,为整个系统供电,并送出一个电信号给BIOS,通知 BIOS 供电系统已经准备完毕。随后 BIOS启动一个程序,进行主机自检,主机自检的主要工作是确保系统的每一个部分都得到了电源支持,内存储器、主板上的其它芯片、键盘、鼠标、磁盘控制器及一些 I/O 端口正常可用,此后,自检程序将控制权还给 BIOS。接下来 BIOS 读取 BIOS 设置,得到引导驱动器的顺序,然后依次检查,直到找到可以用来引导的驱动器(或说可以用来引导的磁盘,包括软盘、硬盘、光盘等),然后调用这个驱动器上磁盘的引导扇区进行引导。BIOS 是怎么知道或说分辨哪一个磁盘可以用来引导的呢? BIOS 将所检查磁盘的第一个扇区(512B)载入内存,放在 0x0000:0x7c00处,如果个扇区的最后两个字节是“55 AA”,那么这就是一个引导扇区,这个磁盘也就是一块可引导盘。通常这个大小为 512B 的程序就称为引导程序(boot)。如果最后两个字节不是“55 AA”,那么 BIOS 就检查下一个磁盘驱动器。通过上面的表述我可可以总结出如下三点引导程序所具有的特点: 

1. 它的大小是 512B,不能多一字节也不能少一字节,因为 BIOS 只读 512B 到内
存中去。 
2. 它的结尾两字节必须是“55 AA”,这是引导扇区的标志。 
3. 它总是放在磁盘的第一个扇区上(0 磁头,0 磁道,1 扇区),因为 BIOS 只读
第一个扇区。 

  因此,在我们编写引导程序的时候,我们也必须注意上面的三点原则,符合上面三点原则的程序都可以看作是引导程序,至少 BIOS 是这样认为的,虽然它也许可能是你随意写的一段并没有什么实际意义的代码。 因为 BIOS 一次只读一个扇区也即 512 字节的数据到内存中,这显然是不够的,现在操作系统都比较庞大,因此我们必须在引导扇区里将存在磁盘上的操作系统的核心部份读进内存,然后再跳转到操作系统的核心部分去执行。好了,一旦bios 发现了Boot Sector,就会将这512B的内容装载到内存的0000:7c00处,然后跳转到0000:7c00 处将控制权彻底交给这段引导代码,到此为止,计算机不再由bios 中固有的程序来控制,而变成由操作系统的一部分来控制。ok, 这里就相当于解释了代码中的第一行的意思。接下来解释一下510-($-$$) db 0 的意思。表示将 0 这个字节重复 510-($-$$) 遍,也就是在剩下的空间中不停地填充0, 直到程序有 510B 为止。这样加上结束的标志0xaa55 就是 512B了。


代码好了就用nasm 编译器成.bin 文件,因为我是用的linux_centos 系统,所以直接用命令对U盘进行写入:


dd if=system.bin of=/dev/sdc1 bs=512 count=1

system.bin 是编译之后生成的bin文件,这里需要注意的是: of=/dev/sdc1  这里的sdc1 是你的U盘驱动器号,不要写成sda 了,那是硬盘的驱动器号,否则的话你将自己硬盘的boot sector进行覆盖,那后果我觉得只有重装了。 如果不知道当前U盘的驱动器号,可以

fdisk -l


获取所有的驱动器号,然后根据大小找到你的U盘 获得驱动器号。将其写入到U盘。


做到这里之后就只剩最后一步了,就是激活你的u盘 ,让它变为Active ,对于这里我用的是一个软件:diskgenius 。其实很想知道激活它的命令,可是逛了一圈没看到,那就直接用软件了。


最后重启电脑设置为U盘启动,就可以开到你期望的结果了!



猜你喜欢

转载自blog.csdn.net/q745401990/article/details/23911365