07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

你<br />

扪心自问,你对得起谭浩强大哥吗?在谭浩强大哥的带领下我们学会了用<br />

#include->main()->printf()来打印hello,world!从而向全世界展示了我们懂C<br />

语言.而stdio.h 就是一个C 库,printf 是一个函数,来自函数库,可是内核中没有标准C 库,所以<br />

开发者们自己准备了一些函数,专门用于内核代码中,所以就出来了一个printk,printk 的"k"就<br />

是kernel,内核.所以我们只要把它当作printf 的兄弟即可,如果感兴趣,可以去研究一下printk<br />

的特点,她和printf 多少有些不同,但基本思想是一样的.所以我们就不多讲了,当然驱动程序中<br />

所<br />

有的printk 语句对U 盘的工作都没有什么用,她无非是打出来给我们看的,或者说打印给用户<br />

看,<br />

或者呢,打印给开发者看,特别是开发者要调试程序的时候,就会很有用.<br />

于是我们更开心了,不用看printk 的话,那就只有一个函数调用了,usb_register.这个函数是干<br />

嘛的?首先这个函数正是来自usb core.凡是usb 设备驱动,都要调用这个函数来向usb core 注<br />

册,从而让usb core知道有这么一个设备.这就像政府规定,一对夫妻结婚要到相关部门那里去登<br />

记是一样的,我们无需知道政府是如何管理的,只需要知道去政府那里登记即可.<br />

这样,insmod 的时候,usb_stor_init 这个函数会被调用,初始化就算完成了.于是设备就开始<br />

工<br />

作了...而当我们rmmod的时候,usb_stor_exit 这个函数会被调用,我们发现,这个函数也很短,<br />

我们能看出来,US_DEBUG 也就是打印一些咚咚,因此,这里实际上也就是调用了一个函数<br />

usb_deregister(),她和usb_register()是一对,完成了注销的工作,从此设备就从usb core 中<br />

消失了.于是我们惊人的发现,编写设备驱动竟是如此的简单,驱动程序真的就这么结束了?...<br />

这一切,不禁让人产生了一种幻觉,让人分不清故事从哪里开始,又从哪里结束,一切都太短暂了.<br />

仿佛开始在结束的时候开始,而结束却在开始的时候就早已结束.<br />

真的吗?<br />

答案是否定的.孔子已经教育过我们,不光要看懂代码,更要理解代码背后的哲学.<br />

所以我们在继续之前,先来看看这里到底有什么哲学.而这,就是伟大的Linux Kernel 2.6 中的<br />

统<br />

一的设备模型.<br />

12<br />

我们并无意去详细介绍2.6 中的设备模型,但是不懂设备模型又怎能说自己懂设备驱动呢?读代<br />

码的人,写代码的人,都要知道,什么是设备驱动?什么又是设备?设备和驱动之间究竟是什么关<br />

系?<br />

设备如何与计算机主机联系起来?我相信在中关村买盗版光盘的哥们儿也能回答这个问题.计算<br />

机世界里,设备有很多种类,比如PCI 设备,比如ISA 设备,再比如SCSI 设备,再比如我们这里的<br />

USB 设备.为设备联姻的是总线,是他把设备连入了计算机主机.但是与其说设备是嫁给了计算<br />

机<br />

主机,倒不如说设备是嫁给了设备驱动程序.很显然,在计算机世界里,无论风里雨里,陪伴着设备<br />

的正是驱动程序.<br />

唯一的遗憾是,计算机中的设备和驱动程序的关系却并非如可乐和拉环的关系那样,一对一.然而<br />

世上又有多少事情总能如人愿呢.<br />

狂欢是一群人的孤单<br />

Linux 设备模型中三个很重要的概念就是总线,设备,驱动.即bus,device,driver,而实际上内核

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!