概述
太久没写博客,最近开始关注虚拟化技术,稍微总结一下过去。
回想17年毕业到现在,已经接触Windows驱动差不多四年时间,期间开发了各式各样的驱动,磁盘、文件、网络、HID、显示器音频、摄像头等等,从0到1一步一个脚印,学习驱动过程,也算是对Windows内核有个“深入”的了解了。
不管开发了多少驱动,真正的技术是对于内核的理解。
犹记得刚开始接触驱动的时候,我会将用户态程序统称业务,我对业务非常不感冒;随着接触的驱动类型越来越多,慢慢觉得其实驱动也不过是一个更小的业务,开始“厌烦”开发各种“更小业务”的驱动,对这类驱动学习热情也越来越低。
我开始将内核技术分为两类:
1. 基础内核技术(热情持续高涨^^)
定义为一类通用、可以在各类驱动可以展现肌肉的技术;
Windows内核实现相关:内存管理器、缓存管理器、IO管理器、PNP管理器等等,进程、线程调用、句柄、对象、中断、DMA等等;
Windows调试技术:Windbg 一些列相关辅助工具;
Windows内核测试:WDK、WCK、WLK、DV、SDV;
Windows分析工具:WPT、ADK、IDA、SYSINTER 还有其他奇奇怪怪的东西,
Windows Hack:这些东西吧,主要还是要对Windows实现有深入的了解才能出各种Hack手段,光看别人的Hack搞来搞去没意思,了解比较少,
2. 专项内核技术(低迷的boy)
这就是我“厌烦”的业务驱动吧,按照标准WDK提供的Demo各种改,符合业务需求,慢慢觉得挺无趣。
其实明白了一个开发框架就行,,,不同的技术栈其实原理相差无几。
喜欢以 总线驱动、功能驱动、过滤驱动划分。
最近公司规划云桌面项目,瞬间觉得技术大门再次向我打开(我比较懒,不是工作相关的技术很难持续长时间静下心来学习);
虚拟化这块也是需要一些偏硬件、硬件驱动相关的知识,软工毕业的也是有点懵懵,不过挺好,又是一个学习进步的机会;
什么设备模拟、中断模拟、CPU模拟啊,一个字,好玩。
说到虚拟化,经常会问自己一句:什么是虚、什么是实?
听过虚拟化,好像觉得技术很陌生,但是好像也很熟悉,自己没学习KVM、QEMU啥的,是不是要从0开始?就拿QEMU的设备虚拟化来说吧,虽然未看过QEMU是怎么实现,但是我起码在Windows整过各种各样的虚拟设备啊,例如Windows虚拟一个设备,简单分为两个步骤呗:
第一,设备的创建;
虚拟设备 和 虚拟化有点类似的技术,
安装虚拟设备驱动时,INF会说明驱动相关用途,同时驱动实现 AddDevice 例程后,Windows PnP manager就会按照驱动的要求;
帮忙创建一个 PDO 设备,但是此时PDO到底是什么东东,PNP是不知道,这些东西就需要驱动去回复了;
驱动需要回复一些特别的PNP IRP请求,例如请求硬件ID、设备名称等等,驱动回复这些信息;
特殊一点,如PCI设备,PCI设备都有配置空间,那么PNP resource IRP来时需要回复相应的内容,这时就需要驱动在内存准备好;但是如果虚拟的设备有一些中断资源,那么中断模拟是个难题,所以虚拟这类设备也是个难点;
Windows 内核 和 PNP 合作拿到这些信息后,就可以“在【设备管理器】创建出一个可以显示的设备了(实际上,是因为驱动按照Windows枚举设备的要求返回了所有必要的设备信息)”;
第二,设备的使用;
创建完设备后,Windows是按照驱动的意愿去使用虚拟设备的,例如虚拟HID设备、虚拟摄像头驱动等等;
以HID设备为例子,用户态Windows服务获取HID触摸信息,通过IOCTL下来,那么此时就需要返回相应的数据;
这些数据从哪里来,驱动自己定义就好了。
QEMU总搞不了啥特殊吧、、是吧。
好了,差不多啰嗦完了,叽叽歪歪差不多了,这个总结也有点随意,,,,
希望若干年后,能成为一个"精通"Linux虚拟化的Windows内核砖家。。。。。
最后
以上就是微笑服饰为你收集整理的Windows四年内核开发总结及未来发展随笔的全部内容,希望文章能够帮你解决Windows四年内核开发总结及未来发展随笔所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复