BearOS
小熊操作系统
----Bear OS V0.1 开发历程----
中学时初次接触计算机,便对神秘的操作系统产生了浓厚兴趣,一直梦想着亲手打造一个属于自己的操作系统。时光飞逝,一晃三十余年,这个梦想始终未曾付诸行动。今年春节后,我终于下定决心,利用业余时间,一步一步地开始了操作系统的开发,只为圆青春时代为自己设下的承诺。
小时候学的是DOS系统,那种简洁的命令行操作方式,至今仍是青春时代美好的回忆。这种系统实现起来相对简单,因此,我的第一个操作系统,就决定做成DOS一样的系统。
我先规划了好自己对操作系统的定义:一个操作系统,首先得实现开机引导,接着驱动各类硬件——CPU、显卡、硬盘、键盘等,最后还得做一个Shell,能输入命令。
最初,我做了一个16位的操作系统,运行在实模式(Real Mode)下。但受限于CPU实模式的设计,只能访问1MB内存,大量硬件性能无法发挥。为了提升性能,我将系统升级为32位保护模式。进入保护模式后,所有BIOS中断都无法使用,驱动几乎要全部自己写,最终还是做了下来。
操作系统不能操作磁盘,那还叫什么系统?于是我又实现了一套自定义文件系统,能够读取磁盘上的程序、加载到内存并运行。
接着,我想为系统开发一些应用程序,这就需要一套自己的类库。于是我写了一套C语言标准库,有了它,就能在自己的系统上开发程序了。最简单的Hello World、显示ASCII字符,都跑通了。为了验证这套库能否支撑更复杂的程序,我又在系统上开发了一个俄罗斯方块小游戏。
不过,这些程序仍然是在宿主机上编写、交叉编译后生成的。我认为,一个真正能用的操作系统,应该能在自身环境下进行开发。于是我计划在系统上做一个文本编辑器,实现本地编程。后来,这个编辑器也实现了。
有了编辑器,系统上还缺一门编程语言。我决定从最简单的开始——做一门解释型语言,类似BASIC或Python。以小时候记忆中中华学习机(Apple II)上的BASIC为蓝本,我开始创建自己的语言。后来为了扩充功能,又加入了C语言和Python的一些特性:比如C语言的变量类型定义、Python的多返回值等。这门语言融合了多种风格,是个"四不像",我就给它取名叫BasC(BAS + C)。
我先用BasC写了一些小程序——打印文本、简单计算、文本处理等。后来觉得应该写个大程序来验证实用性,便用BasC重写了一个俄罗斯方块,对比它与交叉编译版本在运行速度和效果上的差异。
操作系统有了编辑器和编程语言,已初具雏形。但是自己做的操作系统,不支持中文怎么行?于是我着手让系统支持中文。
要支持中文,就不能再用默认的文本模式,必须切换到图形模式。这意味着连英文字符的每一个点阵,都要自己编程在屏幕上画出来。后来我完成了字符显示,并为了兼容性,选择了经典的1024×768的图形模式进行开发。最终,整个系统实现了中文显示。能显示还不够,还得能输入中文,于是我又开发了一个拼音输入法——毕竟用了这么多年电脑,唯一熟悉的输入法就是拼音。
至此,操作系统已初具雏形:运行于1024×768图形模式,支持中文显示与输入;具备Shell和文件系统,能读取、写入并运行磁盘上的文件;拥有自研C语言类库、文本编辑器和编程语言BasC。
----Bear OS V0.2 开发历程----
BearOS 0.1 发布之后,好友建议,既然已经完成大量基础功能,不妨增加类似 Windows 的图形窗口系统,让系统更加完善。这一提议勾起我的回忆:中学初次运行 Windows 3.0 时,鼠标驱动图形界面带来的震撼,至今记忆犹新。受此启发,我启动 BearOS 0.2 版本,着手开发窗口化图形系统。
窗口系统的首要基础是内存管理。我为内核开发内存管理模块,实现内存动态分配与回收,经过多轮调试完成可用版本。
内存模块就绪后,下一个核心难点是多任务调度。当年 Linus 在 Linux 中实现多任务,看到终端交替输出 ABABAB 字符时的那份激动,我也期待在自己的系统复现。
多任务实现远比预期复杂。查阅资料可知,标准方案依赖 Intel TSS 机制,但多次尝试均遇到难以解决的问题。我转而设计一套自定义调度方案:依托时钟中断,修改栈返回地址完成任务切换。该方案是我自主探索的实现方式,目前运行稳定,后续如遇到缺陷,再考虑重构多任务模块。
多任务模块完成后,每一个应用程序启动都会生成独立进程,拥有专属内存与栈空间,进程之间相互隔离。如果单个应用程序出现问题,可以在控制台上杀死该进程,并释放所有资源。
随后开发窗口管理器,实现类 Windows 窗口机制:不同程序运行在独立窗口,支持并发执行。窗口支持重叠、拖拽移动,点击关闭按钮即可销毁窗口并释放资源。
窗口框架搭建完成,我将 0.1 版本的俄罗斯方块、文本编辑器、ASCII 演示程序全部移植为窗口应用,支持多程序并行运行;同时新增实时时钟等图形程序。
图形桌面环境同步落地,搭配小熊主题壁纸美化界面,并加入鼠标驱动支持。中文拼音输入法改造为独立进程的窗口程序,为全系统应用提供输入服务。
同时,我对 Shell 进行重构。旧版 Shell 与内核强耦合,新版拆分为独立应用,依靠系统调用执行命令与管理磁盘。独立进程的设计,允许同时启动多个 Shell 终端。
为测试窗口环境下多任务调度的流畅度,我编写《黑客帝国》字符雨演示程序,用于验证任务切换效果。
系统整体稳定后,我升级 BasC 语言,新增图形窗口与多任务支持。所有 BasC 程序均可在窗口内运行,我同样使用 BasC 实现字符雨程序,检验语言在多任务场景下的表现。
BasC 已经可以开发俄罗斯方块这类小游戏,但尚未验证生产力场景能力。我计划拓展 BasC,实现医学人工智能相关功能,赋予它类似 Python 的数据处理能力。
医学 AI 依赖矩阵运算,要求系统支持浮点运算。我在内核新增浮点运算模块,并开发 3D 立方体演示程序,立方体可在三维空间持续旋转与缩放。随后在 BasC 中增加浮点数与浮点运算支持,基于 BasC 实现的 3D 立方体程序,效果与交叉编译版本完全一致。
打好浮点运算基础,我开始设计医学 AI 功能。实现思路是基于梯度下降构建逻辑回归,完成分类任务。在医学场景中,根据患者各项特征判断疾病,本质就是分类问题。
最终,整套逻辑回归算法完全使用 BasC 编写:程序读取磁盘表格数据集完成训练,输出模型准确率并保存参数;配套独立 Predict 预测程序,加载模型完成疾病预测。使用经典鸢尾花三分类数据集测试,模型准确率可达 98%;采用高血压医学数据集验证,准确率约 96%。这是我用纯 BasC 开发、贴合自身专业方向的程序,成果令我十分满意。
开发调试期间,需要频繁观察 sigmoid 等函数在不同区间的取值变化,为此我额外编写函数绘图工具,支持坐标轴平移与缩放,直观展示函数形态。
早期磁盘读写使用 PIO 模式,性能受限。为提升磁盘 IO 速度,我将内核磁盘访问升级为 DMA 模式。开发 DMA 驱动期间,我顺势新增 AC97 声卡驱动,让系统支持音频播放,实现边开发边听音乐。
至此,BearOS 0.2 版本已经完成大量新增功能。我将系统打包,上传至个人网站,分享给感兴趣的朋友。
运行
Ctrl + ~ :切换中英文输入法
注:系统只支持拼音输入法。拼音输入支持汉字动态调频,暂不支持模糊拼音以及词组输入。
Ctrl + Tab :切换窗口
注:在多个窗口中进行切换,切换的窗口位于最上层。
run.bat 启动QEMU并加载BearOS系统(纯软件模拟)
run_whpx.bat 启动QEMU并加载BearOS系统(开启硬件虚拟化,速度快!)
QEMU,要求使用ctrl+alt+G 脱离虚拟机,并点击窗口关闭按钮,关闭虚拟机,即可关闭BearOS系统
系统命令
ls/dir [file_name] [-h] [-p] : 列出当前目录下文件
ren/rename old_name new_name : 更改文件名字
copy file_name new_name/dir_name : 拷贝文件到新文件或指定目录
del/delete file_name : 删除文件
mv/move file_name new_name/dir_name : 移动文件到新文件或指定目录
cd dir_name : 切换目录
mk/mkdir dir_name : 创建目录
rd/rmdir dir_name : 删除目录
touch file_name [-m a/x] :创建空文件/更改文件属性/将文件或目录更改为当前时间
datetime : 显示当前日期和时间
type/read file_name [-p] : 显示文件内容,按ESC退出
write file_name : 创建新文件,并逐行输入内容,按ESC退出
reboot : 重启系统
部分程序
bin :本地程序目录
edit: 全屏幕的文本编辑软件,用于编辑文本或是本地程序代码
func:绘制函数程序
clock:时钟程序
tet : 本地的俄罗斯方块程序,可以直接运行。w切换形态,a左移,d右移,s落下
ascii : 显示系统支持的ASCII字符
color : 显示系统调色盘
trig:打印0-360度Sin Cos
cube:显示旋转3D立方体
hex: 显示文件的16进制值
Matrix:仿照黑客帝国的字符雨程序
bc : BasC 语言目录
bc : BasC语言解释器 使用:bc file.bc
hi.bc : 用BasC语言写的helloworld程序
division.bc: 用BasC语言写的除法程序,用于测试函数的多变量返回
input.bc: 用BasC语言写的键盘输入程序
color.bc 用BasC语言写的系统颜色及调色盘程序
prime.bc 用BasC语言写的打印1000以内质数程序
sum.bc : 用BasC语言写的从1加到100程序
string.bc: 用BasC语言写的字符串处理演示程序
tet.bc: 用BasC语言写的俄罗斯方块程序。w切换形态,a左移,d右移,s落下
guess.bc: 用BasC语言写的猜数字小游戏
rand.bc: 用BasC语言写的随机函数测试程序
cube.bc: 用BasC语言写的旋转3D立方体程序
matrix.bc: 用BasC语言写的仿黑客帝国字符雨程序
99.bc: 用BasC语言写的99乘法表
predict.bc:用BasC语言编写的逻辑回归预测程序
train.bc: 用BasC语言编写的逻辑回归训练程序
train.dat: 用于逻辑回归训练用的csv格式文件
str.lib 用BasC语言写的字符串处理库,本质上也是.bc程序,可导入其他bc文件使用
math.lib: 用BasC语言写的数学处理库,本质上也是.bc程序,可导入其他bc文件使用
bas.lib :用BasC语言写的基础处理库,本质上也是.bc程序,可导入其他bc文件使用
file.lib : 用BasC语言写的文件处理库,本质上也是.bc程序,可导入其他bc文件使用
music:音乐播放目录
play:WAV播放器
m1 - 4: 歌曲1 - 4