字符设备驱动透彻分析(一)
前言: 首先要说的是对于linux这样优秀的操作系统,我们在分析的时候一定是站在全局去对对待,而非一开始就去扣那些毛细血管的东西。我看到诸多博客对linux下的字符设备驱动进行这样那样的描述,但是大多居于形式,告诉你这样或者那样操作。1.首先我们要谈的是linux下的贯穿始终的一句话“一切皆文件”,很多时候当你想不通的时候,想下这句话也许就豁然开朗,当然linux下的字符设备驱动也是以文件
前言: 首先要说的是对于linux这样优秀的操作系统,我们在分析的时候一定是站在全局去对待,而非一开始就去扣那些毛细血管的东西。我看到诸多博客对linux下的字符设备驱动进行这样那样的描述,但是大多居于形式,告诉你这样或者那样操作。
1.首先我们要谈的是linux下的贯穿始终的一句话“一切皆文件”。
很多时候当你想不通的时候,想下这句话也许就豁然开朗,当然linux下的字符设备驱动也是以文件的形式呈现,既然是文件,那无外乎文件的一系列操作,其实我们之所以可以对文件进行一系列操作最为本质的原因就是文件系统的实现。在linux下linux内核(中间抽象一层,这就好比阿里当年想把快递拿下,搞出了菜鸟驿站,管你什么快递,都放到我这里,我来为用户服务!)在各种类型的文件系统上在加一层,抽象出了VFS,也正是VFS的实现对于我们来说管你底层是什么类型的文件系统对上完全没有影响,read\write就可以走天下。vfs的实现让我们经常感觉,ext2和ext3也没什么区别,其实不然了。下图是一个驱动的架构图,我们这里只关注字符设备驱动,注意:,从架构图上可以清晰的发现,字符设备驱动的架构是如此简单,当我们应用层操作的时候通过系统调用转到内核层,内核中实现文件操作的时候就是我们驱动自己去写代码实现,他并没有调用这个那个文件系统。或者说的直白的就是我们直接和vfs对接就ok!
2.如何和vfs对接?
其实稍微从软件设计上想一下,这种情况下设计方式一定就是填充回调。????我来举个例子,大四的时候我学习了点安卓程序的开发,没开发之前我在想安卓app的代码如何写,一定也像我们写普通程序那样,从一个入口点开始。。。。。。。往下写。当我接触了安卓发现,俩个main函数都没发现,这是为什么,安卓没有程序没有入口点吗?其实就是程序设计的一种思路,为什么一定要提供给你入口点。你打开一个app的时候看到的第一个就是界面,那ok,至于后台是如何创造进程,如何调用界面和我们没半毛钱关系,我们只需要把要显示的界面填充ok就好了,安卓自己会调用。或者从面向对象的角度看过来就是一堆纯虚函数,你来实现吧,函数内部写什么无所谓,反正接口是固定的。
更多推荐
所有评论(0)