技术中的形而上(一)----Linux下的usb四大家族
来源:互联网 发布:网络诈骗的常用方式 编辑:程序博客网 时间:2024/06/07 17:56
http://blog.sina.com.cn/s/blog_6100a4f10101ee3s.html
以前写的文章,搬到这里来.
http://blog.chinaunix.net/uid-103601-id-2961397.html(技术的形而上(一))
http://blog.chinaunix.net/uid-103601-id-2961403.html(技术的形而上(二))
http://blog.chinaunix.net/uid-103601-id-2961404.html(技术的形而上(三))
http://blog.chinaunix.net/uid-103601-id-2961405.html(技术的形而上(四))
形而上学,在我们以马哲为教材的教育环境下,从开始就被灌输了形而上学是错误的,形而上学一直是被批判的。任何一种思想、认识世界的方法都有他合理的一面、局限的一面,我们需要在不同的阶段、不同的场合用不同的方法,没有一种方法是万能的。
概念来源
形而上学(metaphysics)这种命名方式的出现是个巧合。亚里士多德的《形而上学》被誉为西方哲学的圣经,但是他本人生前倒是没有运用这种叫法,而是称为"being as being",即一切存在背后的存在,或可称之为道。他死后200多年,他的后继者着手编他的手稿,在编完了物理学《phusika》之后,开始编亚里士多德关于第一哲学的手稿,然而这个人却想不出合适的名称,于是干脆就叫《物理学之后诸卷》希腊文也就是〈ta meta ta phusika>然后人们去掉冠词,就成了〈metaphusika〉而正好meta这个前缀在希腊语中不仅有之后的意思,也有超越,基础的意思。这正好和亚里士多德第一哲学的概念相符合。中文来源
在信息爆炸的时代,人类的思维能力远没有达到对其接收自如的程度。而每个人的求知欲望或者生存的压力使人类渴望把更多非我的东西转变成自我的东西,但现代社会非我的知识无限浩大,对未知的恐惧感使现代人承受着更多的心理压力,甚至象北京的交通一样造成了不必要的心理拥挤,这种状况就像一个无形的杀手,侵蚀着人类的心灵与健康。
作为一个it技术人员,更是不得不面对这层出不穷的新技术,难道我们这些工作在一线的技术人员真的没有办法么?难道真的要把自己囚困在这纷繁的技术细节中么?使我们无暇思考,变得麻木、盲从。
我们应该抽出一些时间来留给自己去思考这些问题,也许我们能够找到答案,至少我们应该努力去寻找。
形而上者谓之道,形而下者谓之器。两者缺一不可。两者试用在不同的环境之下。
注意:形而上学是研究存在背后的存在、形而上的东西,有好读书不求甚解的意思,辩证法是研究具体的逻辑关系。
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} st1\:*{behavior:url(#ieooui) }
那么我们要讨论的是如何在技术不断更新、涌现的当下,不至于被技术所绑架,而没有时间去静静地思考,所以我们在这个背景下可以考虑用形而上学的思维方式来接触、了解这些新技术。
<</span>我认为世界是不可认知的,技术作为一种经验的总结,是在某个局部的、相对静止的环境中所作出的貌似正确的认知结论,在某个更广阔的范围也许就不是正确的了,说这些的目的就是时刻提醒着我们,我们所接触的知识都是以某种假设为基础所搭建起来的,在没有遇到无法解释的问题时,我们理应认可这种假设的正确性。同时这种方式也告诉我们,在我们理解一件事物时,完全可以创建自己的假设,融入自己思考问题的方式,也许在别人看来并不正确,没有关系,只要能够在自己的思维体系中和谐的共存就ok了>
下面我以linux下的usb作为实例,讲述一下这个系统下的usb家族的组成和工作方式,如果读的过程中或读完后你看到的只是usb,而不是具体事物usb之后的东西,那说明我的讲解没有到位或者说你的理解没有到位,请记住being as being。
我将Linux系统下的usb部分分为四个部门或者叫做四大家族,他们是host控制器驱动、hub驱动、usb core、设备类驱动,他们共同配合着完成了对usb设备的访问操作。这4个家族可以说都是混在linux系统驱动层的,分管着不同的工作。每一个家族都在各尽其职,勇敢的担当着自己的责任,有人在幕后,有人在台前,有人统领大局、左右逢源,有人风光无限。但是他们的存在、工作机制、配合的默契程度都离不开另外一个势力:linux下的设备驱动模型。就如同红楼梦中的薛、王、贾、史四大家族离不开封建礼制一样,要了解linux下usb系统,首先要了解设备驱动模型,可以说,了解了linux下的设备驱动模型,就如同练就了内功心法一样,无论将来开发什么驱动,都不会感到陌生,到那时你就会发现原来设备驱动模型才是老大,usb下的这四个部分只不过是个配角。环境是重要的,当你要调试某个具体的功能时,那就是配置寄存器的事情了。
一 linux 下设备驱动模型
了解设备驱动模型之前,首先要清楚什么是设备?不管你是不是驱动开发人员,稍微有点计算机知识的起码能说出一点来,就是那些总线和通过总线连接的各种硬件设备,如内存、键盘等等。现在的设备太多了,linux也会与时俱进,寻找着管理上的新方式。搞个模型出来,在模型中划分出层次结构,这就便于管理了,所有的设备都按照设备模型的规范来,设备是一层又一层,仰望是parent,俯视是children。
1.1设备模型之总线、驱动、设备
进入/sys/bus,ls一下我们看看是不是有platform这个虚拟总线。我理解那些不包括在普通总线内的设备都挂接在虚拟总线上,来保证模型的通用性。虚拟总线诞生的目的应该就是如此吧。
mengfandong@icp-desktop:/sys/bus$ ls
MCA
设备模型在系统目录中对应的是sys文件夹。
mengfandong@icp-desktop:/sys$ ls
block
在这个文件夹下有我们马上要介绍的driver,bus,device三个目录。
1.2 初始3位结构体
struct bus_type {
};
struct
};
struct device_driver {
};
struct
};
struct device {
#ifdef CONFIG_NUMA
#endif
};
通常device结构不单独使用,而是包含在更大的结构中作为一个子结构使用,比如PCI设备的struct pci_dev,其中的dev域就是一个device对象。
注意这3个结构体中,每个结构体中标记蓝色的那两行。冷静下来好好看看这6行。想想这6行和这3者之间的关系。不要着急往下进行,一定要静下心来、闭上眼睛把这3个结构体的关系从纸面上的暧昧发展到逻辑上的依赖,那就差不多了(这时并不需要了解的太深,毕竟我们关注的是usb,要读书不求甚解,即使在这里我们想深入研究,效果可能也不会太好,因为没有将他放在某个应用环境中,当他和usb驱动联合起来共同工作时,对他才会有更深入的理解)。我们在学习前人的知识,但是我们依然可以从一个设计者的角度去理解这些知识,如果历史给你这个机会,你会怎么设计这个设备驱动模型。
冷静,这里需要耐心!
对上面有了一定的感觉后,我们已经迈出了一大步了。
下面我们应该总结出对3个结构体的简单认识:
struct bus_type中的klist_drivers和klist_devices分别表示了这个总线上拥有哪些设备和哪些驱动。
struct device_driver中的bus表示这个驱动属于哪个总线,klist_devices表示这个驱动都支持哪些设备,一个驱动是可以支持多个设备的,一个设备却只能有一个主儿,所以这里的device是个复数 and list。
struct device中的bus表示这个设备连到哪个总线上,driver表示这个设备的驱动是哪个驱动。
List是什么?linux
由于热插拔及驱动模块动态加载的出现,先有driver还是先有device已经无从考究。不过不管是先有谁,都将在另一条链表中努力寻找自己的另一半(设备链表和驱动链表)。
总线的媒婆角色也发挥得淋漓尽致。努力的撮合着device和driver链表中的每一个成员。
总线上是可以继续挂接总线设备的。就如PCI总线下有usb总线一样。因为每个usb控制器是作为一个pci设备工作的。每一层总线负责管理好自己分管的设备---注意是物理上的。
总线
驱动(driver)可以驱动一类设备(device)
我们举个usb总线的例子,usb总线的bus定义:
struct bus_type usb_bus_type = {
};
蓝色的就是总线功能中具体担当媒婆角色的处理函数。
static int usb_device_match(struct
device一直努力寻找自己的driver,driver也一直在努力实现自己的价值,为更多的device服务。
1.2 真实的kobject 和kset
linux设备模型到底为什么会诞生?以前没有他,linux也活得好好的!就是为了能够让内核更好的了解系统整体的信息。所以新来的小弟(设备、驱动)是需要报个到注册的,做到有据可查。
总线、注册这些东西总是让人感觉很虚幻,太抽象。这么多总线是怎么联系起来的,和现实中实实在在的设备又有什么关系?精神世界再强大最终也得回归到真实的物质世界。
现实中的各个设备是如何在物理拓扑上联系起来的?逻辑和物理总是如影随形!
1.2.1 基本要素
kobject,一猜就知道,kernel object。设备模型是管理设备的,linux中正是使用kobject这个小人物来担当了这个重任。每一个设备在内核眼中都是一个对象。设备模型诞生的目的就是内核希望能够统一的管理所有设备,包括他们之间的逻辑关系以及物理连接关系。逻辑关系在上面我们已经讲过了,物理连接就是通过kobject来实现的。
看一下这个结构体:
Kobject结构定义为:
struct kobject {
char * k name;
char name[KOBJ NAME LEN];
struct kref kref;
struct list head entry;
struct kobject * parent;
struct kset * kset;
struct kobj type * ktype;
struct dentry * dentry; sysfs文件系统中与该对象对应的文件节点路径指针
};
每一个设备,内核对象都会内嵌一个kobject,就像一个gps定位系统。记录着每一个对象的血统,他属于谁,他有多少个后代,责任重大,但他却从不走向幕前,一直作为结构体中的一个内嵌成员出现,可以说是默默无闻,但却是他才能让linux设备模型真正的工作起来。
struct kset {
struct subsystem * subsys;
struct kobj type * ktype;
struct list head list;
struct kobject kobj;
struct kset hotplug ops * hotplug ops;
};
Kset数据结构中内嵌了一个kobject对象,所有属于这个kset
- 技术中的形而上(一)----Linux下的usb四大家族
- 技术中的形而上(一)----Linux下的usb四大家族
- Web技术四大家族
- Linux下的USB总线驱动(一) USB驱动框架usb-skeleton.c分析
- Linux下的USB总线驱动(一) USB驱动框架usb-skeleton.c分析
- Windows下usb接口驱动技术(一)
- Windows下usb接口驱动技术(一)
- linux下的V4L2提取USB摄像头图像(一)
- Linux下的USB总线驱动(一)
- Linux下的USB总线驱动(一)
- Linux下的USB总线驱动(一)
- Linux下的USB总线驱动(一)
- Linux下的USB总线驱动(一)
- NoSQL数据库的四大家族
- position的四大家族
- Linux下的调试技术一
- 四大家族
- 解读NoSQL数据库的四大家族
- Spring基于ThreadLocal的“资源-事务”线程绑定设计的缘起
- 欢迎使用CSDN-markdown编辑器
- 单个fragment的activity
- 中文文案排版指北
- C#连接Oracle 11g 无需安装Oracle客户端
- 技术中的形而上(一)----Linux下的usb四大家族
- Class template basic_ptree(模版类里再混有模版函数)
- 【LeetCode】125. Valid Palindrome
- Oracle存储过程发送邮件--1--创建ACL
- Yslow页面评估
- php标准库(SPL)-迭代器-AppendIterator和ArrayIterator详解
- Tabindex="-1" 与Tabindex="0"、任意数字 的区别
- ubuntu设置搜狗为默认输入法
- App架构设计经验谈:业务层的设计