-
-
[原创]现代意义上进程隔离的内核尝试
-
发表于:
2020-5-22 21:34
3505
-
现代操作系统进程隔离技术探讨
看雪兼容并蓄,海纳百川,承蒙大家不嫌弃,上次发布了自己写的一个内核,完全是闭门造车的产物,但是也算圆了我几年的一个梦想,版主和广大看雪网友捧场,感激不尽。这次我又来了,闭门造车两个月,实现了真正意义上的进程概念,比上次更加完善。这次有几个不同的地方:
1 上次是通过进入保护模式后ltr指令加载tss后,不在改变tss中环境的内容,在cmos时钟中断下,通过push全部寄存器,然后在中断处理中修改成下一个线程的返回地址和还原全部寄存器,实现了线程级别的切换,并没有实现内存隔离,也没有进程概念,有的话,也就是这一个tss代表的进程资源。最大支持256个线程,通过严格的的遵守程序加载的内存地址,来实现多线程同步运行,有的网友说了,你写了这么一大堆,是不是真的我们不知道,这个我就把我测试的几个程序全部上传了,大家可以自己下载测试,下载解压我内核的几个文件,点击其中的liunuxSetup.exe就可以了。言归正传,这次我的实现方式是这样的:还是只有一个tss,APIC仍然关闭,理论上还是只有一个cpu,但是跟上次不同,这个是在8259时钟中断下,这个中断也不同,上次的cmos中断用的中断门,这次是任务门,这样我们就有了2个tss,一个是主程序,一个是8259中断。进入中断后,
tss已经完成了任务切换,这样我们把原来tss里面的内容修改了,这样就实现了任务切换,当然其中比较复杂,包括exe的虚拟地址重定位的处理,其中最有意思的是cr3的切换,加上我自己参考别人的代码基础上实现的slab内存分配算法,我们可以实现真正意义上的现代操作系统的内核了!现在所有的应用程序的线性开始地址都是0X40000000,2gb空间,从1GB到3gb,从__console代码里可以自己测试打印内存分配的线性地址。肯定有人会问,为什么不是高端的3-4gb呢?应为硬件某些地址会映射在这个地址空间段,所以windows内核也是把自己放在高端线性地址。当然我这个内核肯定不完善,其中一个进程创建多个线程后,调用__malloc有可能会出错!__malloc是进程级别上内存分配的函数,需要修改进程的cr3中的某些页表的,有可是哪里有个我没发现的bug.
2 内存分配。上次没有内存分配的概念,这次参考了linux上slab的算法基本原理,照着自己写了一个内存分配。__KMalloc函数不修改cr3,__malloc会在分配内存后修改当前进程的cr3页表的映射。
3 浮点中断的完善。网上百度了大牛的3d算法原理,完全copy了人家的代码,实现了屏幕保护显示一个3d球体。图形算法没有浮点中断的处理是不可想象的,计算矢量图像全是浮点计算,这次加入了浮点的环境保存,但是我觉得仍然很不完善,因为我把他放到别的中断,因为现在是8259中断,放到别的中断中完成,是由可能被别的中断打断的,然后屏幕保护就会退不出来,但是显示却没有问题,有没有这方面的大牛指点一下牛津?
4 自我表扬一下,奋斗了好些天,终于把现在意义上内存隔离的内核写的七七八八了,这里面我可没有吹牛,我这个内核里面功能已经很多了,单个cpu和内存的管理已经初具模型,并不会比任何一个别的差了,我并不惧怕跟Linux和windows比,他们也就那样了,他们强在体系,而不是别的,可能大家会鄙视我,但是我仍然觉得成就感很大!加油!
5 最近失业了,真的,没有哪位兄弟帮忙介绍个工作啊?qq:2210853762,工资高不高的无所谓,主要是失业久了,什么信心也没有了。
6 希望大家踊跃批评,畅所欲言。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2020-5-22 21:35
被satadrover编辑
,原因: