史上最经典的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的框架,感兴趣的可以去看看,目前来说,它还吸引不了我们的眼球.那么 README里有关于这个目录下内容的一般性描述,它不是关键,只是帮助你了解.再说了,面对“read我吧read我吧”这么热情奔放的呼唤,善良的我们是不可能无动于衷的, 这个README文件描述了前边使用ls命令列出的那10个文件夹的用途.那么什么是USB Core? Linux内核开发者们,专门写了一些代码,负责实现一些核心的功能,为别的设备驱动程序提供服务,比如申请内存,比如实现一些所有的设备都会 需要的公共的函数,并美其名曰USB Core. 时代总在发展,当年胖杨贵妃照样迷死唐明皇,而如今人们欣赏的则是林志玲这样的魔鬼身材.同样,早期的Linux内核,其结构并不是如今天这般有层 次感,远不像今天这般错落有致,那时候drivers/usb/这个目录下边放了很多很多文件,USB Core与其他各种设备的驱动程序的代码都堆砌 在这里,后来,怎奈世间万千的变幻,总爱把有情的人分两端.于是在drivers/usb/目录下面出来了 一个core目录,就专门放一些核心的代码,比如初始化整个USB系统,初始化Root Hub,初始化主机控制器的代码,再后来甚至把主机控制器相关的代码也单独建了一个目录,叫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两个文件了. 有地图在手,对于在内核中游荡的我们来说,是件很愉悦的事情,不过, 分析Kconfig和Makefile 进入到drivers/usb/core目录,执行命令ls,结果显示如下: 然后执行wc命令,如下所示. |