史上最经典的Linux内核学习方法论
核中USB子系统的实现,应该没有意见吧?那好,下面就以USB子系统的实现分析为标本看看分析内核源码应该如何入手.
分析README 内核中USB子系统的代码位于目录drivers/usb,这个结论并不需要假设.于是我们进入到该目录,执行命令ls,结果显示如下: atm class core gadget host image misc mon serial storage Kconfig Makefile README usb-skeleton.c 目录drivers/usb共包含有10个子目录和4个文件,usb-skeleton.c是一个简单的USB driver的框架,感兴趣的可以去看看,目前来说,它还吸引不了我们的眼球.那么应该关注什么?如果迎面走来一个ppmm,你会看脸、脚还是其 它?当然答案依据每个人的癖好会有所不同.不过这里的问题应该只有一个答案,那就是Kconfig、Makefile、README. README里有关于这个目录下内容的一般性描述,它不是关键,只是帮助你了解.再说了,面对“read我吧read我吧”这么热情奔放的呼唤,善良的我们是不可能无动于衷的,先来看看里面都有些什么内容. 这个README文件描述了前边使用ls命令列出的那10个文件夹的用途.那么什么是USB Core? Linux内核开发者们,专门写了一些代码,负责实现一些核心的功能,为别的设备驱动程序提供服务,比如申请内存,比如实现一些所有的设备都会 需要的公共的函数,并美其名曰USB Core. 时代总在发展,当年胖杨贵妃照样迷死唐明皇,而如今人们欣赏的则是林志玲这样的魔鬼身材.同样,早期的Linux内核,其结构并不是如今天这般有层 次感,远不像今天这般错落有致,那时候drivers/usb/这个目录下边放了很多很多文件,USB Core与其他各种设备的驱动程序的代码都堆砌 在这里,后来,怎奈世间万千的变幻,总爱把有情的人分两端.于是在drivers/usb/目录下面出来了 一个core目录,就专门放一些核心的代码,比如初始化整个USB系统,初始化Root Hub,初始化主机控制器的代码,再后来甚至把主机控制器相关的代码也单独建了一个目录,叫host目录,这是USB主机控制器随着时代的发展,也开 始有了好几种,不再像刚开始那样只有一种,呢,设计者们把一些主机控制器公共的代码仍然留在core目录下,而一些各主机控制器单独的代码则移到 host目录下面让负责各种主机控制器的人去维护. 那么USB gadget那?gadget白了说就是配件的意思,主要就是一些内部运行Linux的嵌入式设备,比如PDA,设备本身有USB设备控制器(USB Device Controller),可以将PC,也就是我们的主机作为master端,将这样的设备作为slave端和主机通过USB进行通信.从主机的观点来看, 主机系统的USB驱动程序控制插入其中的USB设备,而USB gadget的驱动程序控制外围设备如何作为一个USB设备和主机通__________信.比如,我们的嵌入式板子上支持SD卡,如果我们希望在将板子通过USB连接到PC 之后,这个SD卡被模拟成U盘,那么就要通过USB gadget架构的驱动. 剩下的几个目录分门别类的放了各种USB设备的驱动,比如U盘的驱动在storage目录下,触摸屏和USB键盘鼠标的驱动在input目录下,等等. 我们响应了README的热情呼唤,它便给予了我们想要的,通过它我们了解了USB目录里的那些文件夹都有着什么样的角色.到现在为止,就只剩下内核的地图——Kconfig与Makefile两个文件了. 有地图在手,对于在内核中游荡的我们来说,是件很愉悦的事情,不过,我们的目的是研究内核对USB子系统的实现,而不是特定设备或host controller的驱动,这里的定位很明显,USB Core就是我们需要关注的对象,那么接下来就是要对core目录中的内容进行定位了. 分析Kconfig和Makefile 进入到drivers/usb/core目录,执行命令ls,结果显示如下: 然后执行wc命令,如下所示. |