小弟本不是这行的,阴差阳错的搞了几年软件,一直对操作系统和底层有一些兴趣,想写一个简易的操作系统,一直没有合适的机会,最近赋闲在家2个月时
间,尽自己最大努力,做到最好,目前已经感觉有些力不从心或者说基本完成心中的目标,给大家献丑了,喷不喷都无所谓,权当笑谈。
代码有两部分,一部分是汇编,一部分是vs工程。汇编部分是为了学习而保留的,刚开始因为代码不多大部分用汇编,后来发现效率太低,后来除了键盘中断和int80h调用保留,GDT,IDT等描述符和显示模式等等的初始化工作和中断入口,其他功能性代码全部跳入c/c++代码完成,汇编只剩下一个框架壳子,除了键盘中断和int80h,再无其他功能。理论上进入保护模式跳转后重新加载gdt,idt可以完全摒弃汇编,据测试vs的汇编编译器比masm要好用很多。
该简易系统的功能:
1:8259 时钟中断和cmos三个中断(报警,时间,精确时间),8259和cmos的精确时钟中断共同完成线程的切换,不知道为什么有些虚拟机没有cmos时钟中断。报警中断默认全屏不停的变换颜色显示,每隔3分钟进入。每秒时间中断在左下角显示当前年月日时分秒。精确时间中断完成线程的时间片切换和线程切换。
2:0-19号异常的打印(线程pid,级别,所有寄存器),调试异常(代码,内存地址,单步模式)的模拟尝试处理。
3:任务切换的实现基于单个tss,在中断中加载每个线程,保存所有可用寄存器(8个通用寄存器和ds,es,fs,gs,ss,eip,cs,eflags),切换stack0实现,很简单,轮换运行每个线程,cmos时钟定时为15毫秒,8254为10毫秒,有个别虚拟机主板(macos虚拟机软件中的不行)不支持cmos中断所以在8254中也中检测是否可用。apic相应功能没有使用,单个cpu运行。真机做过测试,由于硬件和测试的虚拟机不兼容,部分功能不可用。
4:图形界面使用16位模式下int10完成,然后进入32位保护模式,设置图像界面和字体,简单的矩形,圆等函数的实现。图形模式字体采用ffff:fa6e地址的图形模式字体显示。
5:保护模式下打开虚拟内存,简单映射为跟物理地址一致的静态内存模式。没有进程信息。暂时还处于一个进程多线程状态。多进程的实现需要依赖动态分页机制内存隔离。
6:鼠标中断的实现,目前只能支持ps2。鼠标采用了矩形中符合4x<6y<9x的点画出来的三角形。鼠标的移动点击等都做了比较完善的中断处理,显示为一个三角形移动中动态变换颜色的图形。鼠标在窗口的移动和背景恢复也做了实用化的处理。
7:比较完善的键盘中断处理。扫描码在SHIFT,CAPSLOCK下的大小写切换,numslock的处理。CTRL+SHIFT+DEL重启,printscreen截屏有个写文件bug未修复不能保存截屏bmp。键盘指示灯都能工作。
8:sb声卡播放wav文件。利用了ISA DMA16和5号中断。
9:显示bmp图像和文本文件。支持8位,24位,32位bmp。在窗口总显示,esc退出。有关闭按钮。
10:ata硬盘的硬件读写硬盘扇区,在此基础上完成了fat32,ntfs的文件名内容读取,FAT32文件系统的写入。在不支持ATA的情况下,运行一个v86虚拟机,利用int13完成对上述分区格式文件的读取(需要操作cr4寄存器的bit0才能在v86中完成虚拟中断,否则就要在中断描述符中实现bios相关功能)。在其他人基础上完成iso9660和fat12文件系统(软盘)的读取。
11:简单窗口的管理,在窗口模式下,光标,键盘鼠标独占,每个窗口都在一个函数里集中管理键盘鼠标显示器和光标。
12:右键菜单的简单尝试。有三个功能,关机,重启,运行屏幕保护程序。关机代码不可用。有兴趣的同学可以看看。
13:串口通信的简单测试。
14:ac97声卡的简单驱动测试,这部分不在代码中。
15:从masm615到vs2015的开发环境支持,看代码可以完成在vs下的继续开发工作,个人目前没有精力再搞这个了。通过对pe文件的学习,
32位保护模式下,汇编代码完成pe文件的映射,重定位,引入导入表,设置基地址,直接从汇编代码跳转到vs的c/c++代码,以及在此基础上dll的文件加载函数调用和线程创建等。
16:线程的代码创建。从磁盘文件到线程在内存的加载和切换。支持16位程序的运行(理论上需要实现int21等中断处理),测试已经可以运行没有int21的dos和com程序。32位线程执行ret可以正常退出也可以调用功能强制关闭线程。目前默认最多256个线程,(64个0级192个3级线程)。地址虽然处在不同区位,但是未做到现在操作系统意义上的进程内存隔离运行。而且apic未开启,默认单核运行,只是一个测试意义上的未登堂入室的小东西。
17:少量的int80h功能调用。包括sleep的实现,键盘鼠标信息获取,鼠标的背景色和恢复,显示的功能等等。
18:文件浏览器窗口的初步实现。文件过多需要上下键切换,esc退出。必须要ps2鼠标支持。
19:控制台的简单命令解析和实现。
总结和问题:个人感觉操作系统是一个非常复杂的系统(废话)。但是目前国内能有借鉴的非常少,这再次说明了我国的基础科学技术比较差。大部分人在搞依照葫芦画瓢的应用开发。个人英语水平跟不上,常常为了看intel文档而烦恼,目前已经放弃了精读ich10等英文文档的计划。开发这些硬件驱动是非常庞大的工作。USB,网卡,显卡,声卡,每一个都是非常庞杂的系统,再加上各种其他差异硬件,网络协议,各种音视频算法,压缩算法,中间层的开发库,开发工具和编译器,常用软件等等凭个人能力根本无法完成。
另外,有几个问题一直困扰我。
1:为什么有些虚拟机没有cmos中断,是不是现在很多主板不再支持bois了,还是apic默认是初始化过的,有些传统中断已经默认不会再触发了?
2:为什么kernel.dll超过了64kb会导致不明的各种故障,代码生成的kernel.dll超过64kb就发生各种异常,百思不得解。
3:多个tss跳转经常发生不明异常,一直不明白那里弄错了,后来放弃了用一个tss实现线程级别的切换。
4:或许传统的bios模式已经不适用了,需要在uefi基础上开发。
另外mbr和loader代码也在汇编目录下,需要从loader加载16位汇编,在16位和32位混杂代码kernel.exe中实现中断定义和入口,kernel.dll中完成较高级功能。需要测试的同学需要用masm命令编译mbr.asm,loader.asm,kernel.exe,kernel.dll,liunuxsetup.exe,并且把font.db(图形模式下字体文件,也可以没有,测试除了macos虚拟机外都可以在ffff:fa6e找到bois自带的图形字体)放到c:\liunux目录下在windows下运行liunuxsetup.exe,linux和windows都是x86架构,想要在linux运行,可以仿照windows程序自己完成linux下的写入工作。
希望认识更多的计算机系统软件爱好者和开发界的牛人。望不吝赐教。qq:2210853762
阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开
发者可享99元/年,续费同价!
最后于 2020-2-28 21:49
被satadrover编辑
,原因: