WYOS是我在15年前大二的时候开始的一个实践活动,目的是手工打造一个基于32位x86的多任务实时操作系统。
没有参考linux的实现(因为当时深受windows习惯所致,不喜欢linux,但是最终借鉴了一些minix系统的bootloader部分)。
这个半成品的系统,在大学期间断断续续坚持了两年,在工作之后就荒废了。
今天(2019.7.11)突然又发现了这份代码,写份简介留作纪念。
WYOS实现了以下功能
- 硬件方面面
- 通过软驱引导(2004年及以前还是非常常见的)
- IO控制
- 3.5寸软盘驱动(DMA支持)
- 其余未来得及实现(比如键盘驱动,至今不能输入 手动狗头)
- 内存方面
- 分页模式
- 每个进程4G线性空间(缺页未实现磁盘缓存,仅用空闲物理内存来处理)
- 针对内存碎片做了一定优化
- 权限控制
- 系统方面
- 多进程多线程的支持(多级优先级队列,抢占式优先级,以线程为调度单位,进程只是资源分配单位)
- 内核态和用户态区隔(ring0、ring3)
- 互斥量、信号量和消息机制(类似于windows的sendmessage)
- FAT12文件系统的支持
- 编程接口
- string标准库(仅根据用户态测试程序的需要来编写,标准库内容太多了)
- 系统调用(仅根据用户态测试程序的需要来编写)
WYOS/trunk
|---boot <dir> 引导代码,实模式到保护模式切换,加载系统内核,并跳转至内核执行
|---driver <dir> 驱动代码
| |---disk <dir> 软驱驱动代码
|---fs <dir> fat12文件系统代码
|---include <dir> 头文件
|---io <dir> io控制代码,DMA控制器驱动
|---kernel <dir> 内核入口head.asm和kernel.c,还有cpu、中断等代码
|---lib <dir> 实现的标准库代码
|---message <dir> 消息机制代码
|---mm <dir> 内存管理代码
|---out <dir> 编译链接输出目录
|---process <dir> 进程线程代码
|---syscall <dir> 系统调用API代码
|---userlib <dir> entry.asm是用来链接用户态程序的main函数,其它为API的ring3层代码
|---userprogram <dir> 用户态测试程序代码,userbuild.bat是用来编译用户态代码的。
|---video <dir> 显示器驱动程序
|---build.bat 内核编译链接脚本,最后会在out目录生成wyosflp.img,刻录至软盘,插入电脑即可启动运行
|---clean.bat 编译清理脚本
|---nasmw.exe 汇编翻译程序
只在windows下进行过编译
配置好gcc的环境变量
软盘镜像通过fdmake.exe,不过这个软件现在应该找不到了。也可以用别的,只要保证文件系统是fat12,并且将WYOSBOOT.BIN写入引导扇区即可。
运行build.bat
编译后的文件以及软盘镜像输出在out目录
调试可以用bochs + gdb的方式。
引导代码直接通过二进制调试即可,c代码通过gdb来调试。
无任何协议。