目前国内的很多计算机资料,大多都是讲述《操作系统原理》,涉及到具体操作系统的实现,能够找到的参考资料非常少。
这里我尝试自己独立实现一个操作系统
这篇文章主要介绍了操作系统的环境配置
并且独立实现一个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的结果如下:
很显然是因为.bochsrc文件没有配置成功。不过这个问题先放一放,我们稍后解决
往Bochs虚拟机内装软盘
用专业一点的话说,就是创建虚拟软盘镜像文件。
但实际上就是往虚拟机里面插入一张软盘。
具体的方法
其实这个一步一步就可以
不再赘述,看下图
编程实现引导程序
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 55 56
| 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 48 49
| plugin_ctrl: unmapped=1, biosdev=1, speaker=1, extfpuirq=1, parallel=1, serial=1, iodebug=1 config_interface: textconfig display_library: x
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
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
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,表示操作系统启动啦~