首页
社区
课程
招聘
[原创]自制X86操作系统
2020-2-18 20:08 7620

[原创]自制X86操作系统

2020-2-18 20:08
7620
        小弟本不是这行的,阴差阳错的搞了几年软件,一直对操作系统和底层有一些兴趣,想写一个简易的操作系统,一直没有合适的机会,最近赋闲在家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编辑 ,原因:
上传的附件:
收藏
点赞11
打赏
分享
最新回复 (8)
雪    币: 9721
活跃值: (3552)
能力值: ( LV12,RANK:319 )
在线值:
发帖
回帖
粉丝
堂前燕 1 2020-2-18 21:01
2
0
tql,Orz
雪    币: 9616
活跃值: (1826)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
Sprite雪碧 1 2020-2-18 22:16
3
0
这个牛逼,过于硬核
雪    币: 2083
活跃值: (227)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Mouri_Naruto 1 2020-2-18 22:28
4
0
个人建议你可以研究下编写 UEFI 应用程序,毕竟现在的机器都是 UEFI 的了,而且基本都能使用 C 语言,甚至 C++
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
榴莲味奥利奥 2020-2-27 00:47
5
0
支持加油
雪    币: 59
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wcsxzg008 2020-2-27 03:50
6
0
牛逼,加油加油!!
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
nimade13 2020-2-28 10:30
7
0
雪    币: 128
活跃值: (1126)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
百里梦行 2020-2-28 21:09
8
0
雪    币: 13
活跃值: (215)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
satadriver 2023-4-10 14:31
9
0
good
游客
登录 | 注册 方可回帖
返回