小弟本不是这行的,阴差阳错的搞了几年软件,一直对操作系统和底层有一些兴趣,想写一个简易的操作系统,一直没有合适的机会,最近赋闲在家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声卡的简单驱动测试,这部分不在代码中。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2020-2-28 21:49
被satadrover编辑
,原因: