奇书网首页狭义的驱动程序就是用来实现对硬件设备的I/O控制的。广义的驱动就多了,比如:
- Filter driver,比如挂在文件操作上,可以用来实现杀毒软件/备份软件对文件读写的监控。
- 有些驱动还不是kernel mode的,比如一些打印机驱动是运行在用户态的,包括把gdi指令转换成打印机指令。
- 你更可以写个奇怪的“驱动”跑在kernel mode里面,目的就是能够拿到kernel级别的权限。比如一些看上去不应该需要kernel权限的软件。
一般应用程序是不直接跟硬件打交道的,这样可以极大的降低开发难度和成本,而操作硬件的任务就交给了驱动。只有自己才最了解做出来的东西,自己才更了解如何去操作自己的硬件,于是硬件商生产的硬件往往还附带这为其编写的驱动。而应用程序的开发者就不需要考虑这些东西,你要做的就是直接调用而已
当你想点亮一个LED灯,最简单的办法就是用电池给这个LED灯的两端加上一个合适的电压,这个电压就驱动了这个LED灯发光
但是如果你想用电脑自动控制这个LED灯发光,那就不能手动用电池驱动他了,而是要用电脑里面的CPU控制一个GPIO的PIN引脚输出一个合适的电压,然后把LED接到这个CPU对应的GPIO引脚上,即可发光,那么控制这个引脚输出合适电压的程序就叫做驱动程序。就像我们在8051,STM32,Arduino单片机上写的程序一样。
上面的LED灯只是一个最简单的例子,我们实际用电脑肯定不是看LED灯发光这么简单,我们通常使用显示器来观察电脑运行程序后的计算结果。
而电脑的显示器通常是通过HDMI或者VGA线连接到显卡,显卡再通过PCI-E总线连接到CPU,所以显卡也需要一个驱动程序,让CPU通过PCI-E的引脚驱动显卡,而这里控制PCI-E引脚是否应该输出电压,以及应该按照什么时序来输出特定电压的那段程序,就是显卡的驱动程序。PCI-E的引脚类似于前面的GPIO引脚,只不过PCI-E是一种具有高层次协议栈的总线协议,并且在物理层使用的是差分信号传输,比GPIO这种简单原始的接口速度更快并且多了很多控制功能。
最后,显卡再通过HDMI或者VGA协议芯片将显示信号发送到显示器,显示器再输出到显示面板,我们就能看到电脑上丰富多彩的图形画面了。
总结:驱动程序就是控制CPU上的IO总线(包括传统单片机的GPIO,以及X86的地址,数据端口,PCI-E端口,通往南桥的DMI总线保护模式的规范,控制总线特权级程序,这些特权级程序通常要得到操作系统的许可才能运行,所以“驱动级”安全保护指的就是它可以在操作系统最底层保护你的电脑。
Windows系统中,所有可执行代码(包括并不限于各种EXE等)可能运行在用户态,也可能运行在内核态。
绝大多数用户进程都是运行在用户态的,这些进程无法直接操作硬件,访问系统底层资源;
绝大多数驱动都是运行在内核态的,可以操作各种硬件,访问操作系统的大多数底层资源。
底层资源的范围很广,比如LOL要防止外挂,只在用户态做保护是不够的,需要装个驱动进入内核态防止其它进程入侵。
总之,因为Windows限制了普通用户进程的行为和权限,所以很多成规模的软件都要有驱动来操作更底层的资源。
如果一个代码以普通应用的方式运行,有很多功能是受限的,至少是对用户可见可控的。
|