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

[原创]自制X86操作系统

2020-2-18 20:08
8457
        小弟本不是这行的,阴差阳错的搞了几年软件,一直对操作系统和底层有一些兴趣,想写一个简易的操作系统,一直没有合适的机会,最近赋闲在家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声卡的简单驱动测试,这部分不在代码中。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-2-28 21:49 被satadrover编辑 ,原因:
上传的附件:
收藏
免费 11
支持
分享
最新回复 (8)
雪    币: 10779
活跃值: (4417)
能力值: ( LV12,RANK:404 )
在线值:
发帖
回帖
粉丝
2
tql,Orz
2020-2-18 21:01
0
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
3
这个牛逼,过于硬核
2020-2-18 22:16
0
雪    币: 2015
活跃值: (232)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
个人建议你可以研究下编写 UEFI 应用程序,毕竟现在的机器都是 UEFI 的了,而且基本都能使用 C 语言,甚至 C++
2020-2-18 22:28
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
支持加油
2020-2-27 00:47
0
雪    币: 59
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
牛逼,加油加油!!
2020-2-27 03:50
0
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
2020-2-28 10:30
0
雪    币: 128
活跃值: (1126)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
2020-2-28 21:09
0
雪    币: 13
活跃值: (215)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
good
2023-4-10 14:31
0
游客
登录 | 注册 方可回帖
返回
//