写这篇博客是因为听到一句话,应用层驱动?开始思考驱动就驱动不是在内核吗,怎么跑应用层去了。其实这个应用层驱动并不是我们常说的内核驱动,只是一个模块实现功能的一个集合,被makefile按照规则生成了一个文件叫.SO动态链接库,他本身没有驱动操作硬件的功能,而是调用内核驱动去运作,就像以前单片机里面代码功能多了,我们就用多个C文件和H文件代表每个模块,主函数main去调用他们,这样看起来层次清晰很多。每个.SO文件看似相关,但是内部已经将其分离,比如通过摄像头采集图片后进行3A算法处理,可以将摄像头采集部分当一个模块.SO,3A当一个.SO,连个相对独立的部分,但又是关联的,分层两个后,当摄像头需要更换,我们就更新摄像头部分的动态库,不需要更新3A部分,3A只负责将采集的图片进行处理,图片怎么来的它不管。
(1).KO文件为内核驱动,必须在内核态工作,用来实际操作硬件。比如IIC协议。
(2).SO为动态链接库,工作在用户态,调用内核驱动实现功能。比如摄像头采集模块功能,使用到IIC协议工作。
(3).SO文件只更新DLL(动态链接库)就行,不需要重新编译内核,或做其他更改配置。
(4)需要保密的驱动可以使用驱动源码make生产.KO后,仅仅给用户提供.KO,不提供源代码C文件,用户动态安装该驱动。
(5)linux内核本身自带的可裁剪驱动是开源的,目录提供源码C文件,用户可以修改,并选择性添加或裁减驱动。
(6)当代码太大后,基本都是使用模块化思想,我们添加的外设,如果内核不支持,可以手动编写makefile生产.KO或.SO文件。
(7).SO文件可以被多个可执行文件共同调用,相比静态链接节省空间。
(8).SO文件作用相当于单边机代码里面的某个模块的.C文件和.H文件一样,主函数调用这个C文件里面的功能函数。