`
yuanjinxiu
  • 浏览: 657827 次
文章分类
社区版块
存档分类
最新评论

那年,我学习《Linux内核修炼之道》——分析内核源码如何入手?(上)

阅读更多



这些文章是阅读《linux内核修炼之道》的笔记和一些自己补充的知识和感悟,写的不清楚的地方请查看《linux内核修炼之道》等资料。同时文章若有不妥的地方请大家指出,谢谢。

转载请注明出处:http://blog.csdn.net/muge0913/article/details/7250560


学习内核,就是学习内核的源代码,任何内核有关的书籍都是基于内核,而又不高于内核的。

既然要学习内核源码,就要经常对内核代码进行分析。

下面就以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,结果显示如下:

Kconfig Makefile buffer.c config.c devices.c devio.c driver.c
endpoint.c file.c generic.c hcd-pci.c hcd.c hcd.h hub.c hub.h
inode.c message.c notify.c otg_whitelist.h quirks.c sysfs.c urb.c
usb.c usb.h

然后执行wc命令,如下所示。



drivers/usb/core目录共包括24个文件,16880行代码。core不愧是core,为大家默默的做这么多事。不过这么多文件里不一定都是我们所需要关注的,先拿咱们的地图来看看接下来该怎么走。先看看Kconfig文件,可以看到下面的选项。



选项USB_DEVICEFS与usbfs文件系统有关。usbfs文件系统挂载在/proc/bus/usb目录,显示了当前连接的所有USB设备及总线的各种信息,每个连接的USB设备在其中都会有一个对应的文件进行描述。比如文件/proc/bus/usb/xxx/yyy,xxx表示总线的序号,yyy表示设备所在总线的地址。不过不能够依赖它们来稳定地访问设备,因为同一设备两次连接对应的描述文件可能会不同,比如,第一次连接一个设备时,它可能是002/027,一段时间后再次连接,它可能就已经改变为002/048。

就好比好不容易你暗恋的mm今天见你的时候对你抛了个媚眼,你心花怒放,赶快去买了100块彩票庆祝,到第二天再见到她的时候,她对你说你是谁啊,你悲痛欲绝的刮开那100块彩票,上面清一色的谢谢你。

因为usbfs文件系统并不属于USB子系统实现的核心部分,与之相关的代码我们可以不必关注。



这一项是有关USB设备的挂起和恢复。开发USB的人都是节电节能的好孩子,所以协议里就规定了,所有的设备都必须支持挂起状态,就是说为了达到节电的目的,当设备在指定的时间内,如果没有发生总线传输,就要进入挂起状态。当它收到一个non-idle的信号时,就会被唤醒。节约用电从USB做起。不过这个与主题也没太大关系,相关代码也可以不用关注了。

剩下的还有几项,不过似乎与咱们关系也不大,还是去看看Makefile。



Makefile可比Kconfig简略多了,所以看起来也更亲切点,咱们总是拿的money越多越好,看的代码越少越好。这里之所以会出现CONFIG_PCI,是因为通常USB的Root Hub包含在一个PCI设备中。hcd-pci和hcd顾名而思义就知道是说主机控制器的,它们实现了主机控制器公共部分,按协议里的说法它们就是HCDI(HCD的公共接口),host目录下则实现了各种不同的主机控制器。

CONFIG_USB_DEVICEFS前面的Kconfig文件里也见到了,关于usbfs的,与咱们的主题无关,inode.c和devices.c两个文件也可以不用管了。

那么我们可以得出结论,为了理解内核对USB子系统的实现,我们需要研究buffer.c、config.c、driver.c、endpoint.c、file.c、generic.c、hcd.c hcd.h、hub.c、message.c、notify.c、otg_whitelist.h、quirks.c、sysfs.c、urb.c 和usb.c文件。这么看来,好像大都需要关注的样子,没有减轻多少压力,不过这里本身就是USB Core部分,是要做很多的事为咱们分忧的,所以多点也是可以理解的。




这些文章是阅读《linux内核修炼之道》的笔记和一些自己补充的知识和感悟,写的不清楚的地方请查看《linux内核修炼之道》等资料。同时文章若有不妥的地方请大家指出,谢谢。

转载请注明出处:http://blog.csdn.net/muge0913/article/details/7250560








分享到:
评论

相关推荐

    LINUX内核修炼之道

    将Linux内核的修炼之道总结为四个层次:第一层次目的是对Linux以及内核有个全面的认识和了解,掌握Linux内核源代码的分析方法。第二个层次讨论了内核中系统初始化、系统调用、中断处理、进程管理及调度、内存管理、...

    Linux常见驱动源码分析(kernel hacker修炼之道全集)--李万鹏

    Linux常见驱动源码分析(kernel hacker修炼之道)--李万鹏 李万鹏 IBM Linux Technology Center kernel team 驱动资料清单内容如下: Linux设备模型(中)之上层容器.pdf Linux设备模型(上)之底层模型.pdf Linux...

    《Linux内核修炼之道》精华版之方法论

    将Linux内核的修炼之道总结为四个层次:第一层次目的是对Linux以及内核有个全面的认识和了解,掌握Linux内核源代码的分析方法。第二个层次讨论了内核中系统初始化、系统调用、中断处理、进程管理及调度、内存管理、...

    《Linux内核修炼之道》超值精华版

    任桥伟《Linux内核修炼之道》精华版连载的最 新word版本,内含: NO1:《Linux内核修炼之道》精华版之方法论 (完整版) NO2:Linux内核学习的4个层次 NO3:Linux内核学习解决方案 NO4:linux应用开发技巧

    Linux内核修炼之道 doc

    《Linux内核修炼之道》语言通俗易懂,内容覆盖了内核的学习方法到内核设计与实现等各方面内容,能够带领读者快速走入Linux内核的世界,适合对Linux内核学习茫然的初学者,也适合各类希望深入理解Linux内核的读者。

    Linux内核修炼之道精华版

    详解神秘Linux内核 Linux内核修炼之道精华版

    Linux内核修炼之道精华版之方法论

    Linux内核修炼之道精华版,精华版方法论部分导读、缅怀已逝去的十八年(1991~1998)、缅怀已逝去的十八年(1999~2002)、缅怀已逝去的十八年(2003~2006)、缅怀已逝去的十八年(2007~2009)、Kernel地图、分析内核...

    Linux内核修炼之道-精华版之方法论.pdf

    Linux内核修炼之道-精华版之方法论,论坛上的精华内容。

    [Linux内核修炼之道]

    [Linux内核修炼之道].华清远见嵌入式培训中心,任侨.高清文字版 [Linux内核修炼之道].华清远见嵌入式培训中心,任侨.高清文字版

    《Linux内核修炼之道》pdf版

    《Linux内核修炼之道》pdf版

    《Linux内核修炼之道》(pdf版)

    《Linux内核修炼之道》(pdf版)学习内核很好的教程

    Linux内核修炼之道

    很好Linux内核休息书籍 第一层次修炼的内容包括了前三章, ...代码的工具,最后,突出强调了内核源码分析过程中极为重要的两个角色——Kconfig 和 Makefile,并以 USB 子系统为例,演示了如何利用这两个角色进行代码分析。

    LINUX内核修炼之道 扫描版part2

    12586941_LINUX内核修炼之道_任桥伟编著_人民邮电出版社_2010.07.part2.rar这是part2 第二部分 高清扫描版

    Linux内核修炼之道(精华版)

    将Linux内核的修炼之道总结为四个层次:第一层次目的是对Linux以及内核有个全面的认识和了解,掌握Linux内核源代码的分析方法。第二个层次讨论了内核中系统初始化、系统调用、中断处理、进程管理及调度、内存管理、...

    linux内核修炼之道

    linux内核学习方面的文档,对linux内核有兴趣的看以看看

    《Linux内核修炼之道》(pdf版).pdf

    《Linux内核修炼之道》(pdf版).pdf

    《Linux内核修炼之道》精华版之方法论.pdf

    《Linux内核修炼之道》精华版之方法论.pdf

Global site tag (gtag.js) - Google Analytics