史上最牛的Linux内核学习方法论(2)

  前面通过Kconfig文件的分析,我们确定了只需要去关注CONFIG_USB_STORAGE选项。在Makefile文件里查找CONFIG_USB_STORAGE,从第9行得知,该选项对应的模块为usbstorage。因为Kconfig文件里的其他选项我们都不需要关注,所以Makefile的11~22行可以忽略。第24行意味着我们只需要关注 scsiglue.c、protocol.c、transport.c、usb.c、initializers.c以及它们同名的.h头文件。

  Kconfig和Makefile很好的帮助我们定位到了所要关注的目标,就像我们到一个陌生的地方要随身携带地图,当我们学习Linux内核时,也要谨记寻求Kconfig和Makefile的帮助。

  透过现象看本质,兽兽门无非就是一些人体艺术展示。同样往本质里看过去,学习内核,就是学习内核的源代码,任何内核有关的书籍都是基于内核,而又不高于内核的。

  既然要学习内核源码,就要经常对内核代码进行分析,而内核代码千千万,还前仆后继的不断往里加,这就让大部分人都有种雾里看花花不见的无助感。不过 不要怕,孔老夫子早就留给我们了应对之策:敏于事而慎于言,就有道而正焉,可谓好学也已。这就是说,做事要踏实才是好学生好同志,要遵循严谨的态度,去理 解每一段代码的实现,多问多想多记。如果抱着走马观花,得过且过的态度,结果极有可能就是一边看一边丢,没有多大的收获。

  假设全国房价上涨1.5%,假设80后局长是农民子弟??,既然我们的人生充满了假设,那么我在这里假设你现在就迫不及待的希望研究内核中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我吧”这么热情奔放的呼唤,善良的我们是不可能无动于衷的,所以先来看看里面都有些什么内容。

23 Here is a list of what each subdirectory here is, and what is contained in

24 them.

25

26 core/- This is for the core USB host code, including the

27 usbfs files and the hub class driver ("khubd").

28

29 host/- This is for USB host controller drivers. This

30 includes UHCI, OHCI, EHCI, and others that might

31 be used with more specialized "embedded" systems.

32

33 gadget/- This is for USB peripheral controller drivers and

34 the various gadget drivers which talk to them.

35

36

37 Individual USB driver directories. A new driver should be added to the

38 first subdirectory in the list below that it fits into.

39

40 image/- This is for still image drivers, like scanners or

41 digital cameras.

42 input/- This is for any driver that uses the input subsystem,

43 like keyboard, mice, touchscreens, tablets, etc.

44 media/- This is for multimedia drivers, like video cameras,

45 radios, and any other drivers that talk to the v4l

46 subsystem.

47 net/- This is for network drivers.

48 serial/- This is for USB to serial drivers.

49 storage/- This is for USB mass-storage drivers.

50class/- This is for all USB device drivers that do not fit

51 into any of the above categories, and work for a range

52 of USB Class specified devices.

53 misc/- This is for all USB device drivers that do not fit

54 into any of the above categories.

  这个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目录下,等等。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwpzgz.html