BlingOS开发笔记--开发准备与环境配置
前言
开发操作系统的原因:
1. 想以更直接的方式了解操作系统
2. 这™是我毕设
参考的资料:
1. 操作系统真象还原
2. 现代操作系统 原书第4版
3. Orange'S:一个操作系统的实现
4. 一个64位操作系统的设计与实现(主要)
开发环境配置
我使用的是Clion,通过SSH连接到虚拟机,因为虚拟机里面的Clion太慢了.编译完成后将文件写入到虚拟硬盘中,再通过FTP传回宿主机,然后在bochs里面调试
需要的工具:
- Clion(IDE,哪个方便用哪个)
- bochs(虚拟机,用作运行和调试)
- 任意ftp服务器工具(如FileZilla)
- gcc
- nasm
- make
- qemu-nbd qemu-img(用来生成和挂载虚拟硬盘)
- fdisk
- grub(用于引导OS)
配置步骤
1.整个虚拟机,最好是ubuntu的,然后把上面的4-9工具都安装好
2.建立目录结构
BlingOS
├─bootloader
│ └─legacy
├─include
│ ├─device
│ └─kernel
├─lib
├─script
├─src
│ ├─device
│ ├─kernel
│ └─user
└─target
├─device_obj
├─kernel_obj
└─lst
include是头文件目录,src是源码目录,target是生成的目标文件 内核程序 虚拟磁盘等文件的目录
3. 在项目的根目录下建立makefile,把用得比较多的命令写入到makefile里
先直接在shell里运行以下命令
qemu-img create -f vpc target/disk.vhd 20G #虚拟硬盘格式是vhd,大小20G
sudo modprobe nbd #加载nbd内核模块
sudo qemu-nbd -c /dev/nbd0 ~/BlingOS/target/disk.vhd #使用qemu-nbd挂载虚拟硬盘
然后给虚拟硬盘分区
fdisk /dev/nbd0 #使用fdisk操作nbd0
o #创建DOS分区表
n #创建新分区
p #主分区
1 #分区号1
2048 #第一个扇区号2048
+300M #大小300M
t #更改文件系统类型
0c #改为FAT32
a #将主分区激活
w #写入更改
然后给虚拟硬盘安装GRUB
mkdir ~/tmp #创建用于挂载分区的目录
sudo mount /dev/nbd0p1 ~/tmp #将刚刚分出来的分区挂载至tmp下
sudo mkdir ~/tmp/boot ~/tmp/BlingOS #创建两个目录,boot用于存放grub,BlingOS用于存放内核
sudo grub-install --boot-directory=/home/用户名/tmp/boot /dev/nbd0 #安装GRUB
然后在~/tmp/boot/grub下创建grub.cfg,写入以下内容
set default=0
set timeout_style=menu
set timeout=5
menuentry "BlingOS" {
insmod multiboot2
multiboot2 /BlingOS/kernel
boot
}
menuentry "reboot" {
insmod reboot
reboot
}
menuentry "halt" {
insmod halt
halt
}
写入完成后将vhd文件上传至宿主机(ftp或其他方式都可),接下来的操作在宿主机中进行
建立一个bochsrc.bxrc文件,写入以下内容(路径相关内容根据自己情况进行更改)
# configuration file generated by Bochs
plugin_ctrl: unmapped=true, biosdev=true, speaker=true, extfpuirq=true, parallel=true, serial=true, gameport=true
config_interface: win32config
display_library: win32, options="gui_debug"
memory: host=512, guest=512
romimage: file="bochs安装路径/BIOS-bochs-latest**", address=0x00000000, options=none
vgaromimage: file="bochs安装路径/VGABIOS-lgpl-latest"
boot: disk, floppy, cdrom,
floppy_bootsig_check: disabled=1
# no floppyb
ata0: enabled=true, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="虚拟磁盘绝对路径", mode=vpc
ata0-slave: type=none
ata1: enabled=true, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata1-master: type=none
ata1-slave: type=none
ata2: enabled=false
ata3: enabled=false
optromimage1: file=none
optromimage2: file=none
optromimage3: file=none
optromimage4: file=none
optramimage1: file=none
optramimage2: file=none
optramimage3: file=none
optramimage4: file=none
pci: enabled=1, chipset=i440fx
vga: extension=vbe, update_freq=5, realtime=1
cpu: count=1:1:1, ips=20000000, model=bx_generic, reset_on_triple_fault=0, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0
cpuid: level=6, stepping=6, model=3, family=6, vendor_string="GenuineIntel", brand_string="Intel(R) Core(TM) i7-4770 CPU (Haswell)"
cpuid: mmx=true, apic=xapic, simd=ssse3, sse4a=false, misaligned_sse=false, sep=true
cpuid: movbe=true, adx=true, aes=true, sha=true, xsave=true, xsaveopt=true, x86_64=true
cpuid: 1g_pages=true, pcid=true, fsgsbase=true, smep=true, smap=true, mwait=true
cpuid: vmx=1
print_timestamps: enabled=0
port_e9_hack: enabled=0
private_colormap: enabled=0
clock: sync=none, time0=local, rtc_sync=0
# no cmosimage
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=false, toggle=ctrl+mbutton
sound: waveoutdrv=win, waveout=none, waveindrv=win, wavein=none, midioutdrv=win, midiout=none
speaker: enabled=true, mode=sound
parport1: enabled=true, file=none
parport2: enabled=false
com1: enabled=true, mode=null
com2: enabled=false
com3: enabled=false
com4: enabled=false
usb_uhci: enabled=1, port1=none, options1=none, port2=none, options2=none
然后win+r输入cmd,打开命令提示符
cd /D "bochs安装目录"
bochsdbg -f bochsrc.bxrc的路径 -q
然后bochs会启动gui-debugger,点击continue,当出现以下画面时,说明成功了
注意:使用FTP将虚拟硬盘上传至宿主机时,一定要将传输模式设为binary,否则上传的虚拟硬盘与源文件不一样