实现操作系统:BootLoader引导程序(一)

目前国内的很多计算机资料,大多都是讲述《操作系统原理》,涉及到具体操作系统的实现,能够找到的参考资料非常少。

这里我尝试自己独立实现一个操作系统
这篇文章主要介绍了操作系统的环境配置
并且独立实现一个hello world!

Bochs虚拟机的安装

官网下载解压什么的,不赘述。

我安装在/opt/bochs-2.6.9下面

1
sudo ./configure --with-x11 --with-wx --enable-debugger --enable-disasm
1
2
sudo make
sudo make install

安装完成后,在terminal输入bochs如下
第一次输入bochs的结果如下:

01

很显然是因为.bochsrc文件没有配置成功。不过这个问题先放一放,我们稍后解决

往Bochs虚拟机内装软盘

用专业一点的话说,就是创建虚拟软盘镜像文件。
但实际上就是往虚拟机里面插入一张软盘。

具体的方法

1
bximage

其实这个一步一步就可以
不再赘述,看下图

02

03

编程实现引导程序

boot.asm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
org 0x7c00 //start from 0x7c00
BaseOfStack equ 0x7c00
Label_Start:
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, BaseOfStack
;======= clear screen
mov ax, 0600h
mov bx, 0700h
mov cx, 0
mov dx, 0184fh
int 10h
;======= set focus
mov ax, 0200h
mov bx, 0000h
mov dx, 0000h
int 10h
;======= display on screen : Start Booting......
mov ax, 1301h
mov bx, 000fh
mov dx, 0000h
mov cx, 10
push ax
mov ax, ds
mov es, ax
pop ax
mov bp, StartBootMessage
int 10h
;======= reset floppy
xor ah, ah
xor dl, dl
int 13h
jmp $
StartBootMessage: db "Start Boot" //can be changed, such as "I love you"
;======= fill zero until whole sector
times 510 - ($ - $$) db 0
dw 0xaa55

编译上一步的asm文件

1
sudo dd if=boot.bin of=/opt/bochs-2.6.9/boot.img bs=512 count=1 conv=notrunc

其实,上一步就做了一件事情,我们把引导文件写入软盘镜像
传输块的大小为512B,参数count=1指定写入到目标文件的块数量
conv=notrunc表示写入数据后不截断输出文件尺寸的大小

启动bochs虚拟机

配置bochsrc文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# configuration file generated by Bochs
plugin_ctrl: unmapped=1, biosdev=1, speaker=1, extfpuirq=1, parallel=1, serial=1, iodebug=1
config_interface: textconfig
display_library: x
#memory: host=2048, guest=2048
romimage: file="/usr/local/share/bochs/BIOS-bochs-latest"
vgaromimage: file="/usr/local/share/bochs/VGABIOS-lgpl-latest"
boot: floppy
floppy_bootsig_check: disabled=0
floppya: type=1_44, 1_44="boot.img", status=inserted, write_protected=0
# no floppyb
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=none
ata0-slave: type=none
ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata1-master: type=none
ata1-slave: type=none
ata2: enabled=0
ata3: enabled=0
pci: enabled=1, chipset=i440fx
vga: extension=vbe, update_freq=5
print_timestamps: enabled=0
debugger_log: -
magic_break: enabled=0
port_e9_hack: enabled=0
private_colormap: enabled=0
clock: sync=none, time0=local, rtc_sync=0
# no cmosimage
# no loader
log: -
logprefix: %t%e%d
debug: action=ignore
info: action=report
error: action=report
panic: action=ask
keyboard: type=mf, serial_delay=250, paste_delay=100000, user_shortcut=none
mouse: type=ps2, enabled=0, toggle=ctrl+mbutton
speaker: enabled=1, mode=system
parport1: enabled=1, file=none
parport2: enabled=0
com1: enabled=1, mode=null
com2: enabled=0
com3: enabled=0
com4: enabled=0
megs: 2048

启动文件

这里注意一下必须在/opt/bochs-2.6.9目录下执行

1
2
cd /opt/bochs-2.6.9
sudo bochs -f '/home/fogsail/Software/os-boot/bochsrc'

最后按下c键,自然出现了start boot,表示操作系统启动啦~

04
05
06

原创技术分享,您的支持鼓励我继续创作