07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

27<br />

折了.在这里需要强调的是,整个内核代码中,像这种判断内存申请是否成功的语句是无处不在,每<br />

次有内存申请的语句,其后边一定会跟随一句判断申请成功与否的语句.写过代码的人都该知道,<br />

这样做是很有必要的,因为你没有申请到内存,那么继续下去就是没有意义的,除了可能让人见识<br />

计算机是如何崩溃之外,没有别的好处.而内存申请不管申请了多大,都有可能失败,写代码的人这<br />

样做无非是想告诫我们,我们的计算机并不总像人民币那般坚挺,她很脆弱.当你真正用计算机写<br />

代码的时候你就会发现计算机多么的脆弱和无力。<br />

942 行,给us 初始化为全0.<br />

934 行这个US_DEBUGP,是一个宏,来自drivers/usb/storage/debug.h,接下来很多代码中<br />

我们也会看到这个宏,她无非就是打印一些调试信息.debug.h 中有这么一段,<br />

54 #ifdef CONFIG_USB_STORAGE_DEBUG<br />

55 void usb_stor_show_command(struct scsi_cmnd *srb);<br />

56 void usb_stor_show_sense( unsigned char key,<br />

57 unsigned char asc, unsigned char ascq );<br />

58 #define US_DEBUGP(x...) printk( KERN_DEBUG USB_STORAGE x )<br />

59 #define US_DEBUGPX(x...) printk( x )<br />

60 #define US_DEBUG(x) x<br />

61 #else<br />

62 #define US_DEBUGP(x...)<br />

63 #define US_DEBUGPX(x...)<br />

64 #define US_DEBUG(x)<br />

65 #endif<br />

66<br />

67 #endif<br />

这里一共定义了几个宏,US_DEBUGP,US_DEBUGPX,US_DEBUG,差别不大,只是形式上略<br />

有不同罢了.<br />

需要注意的是,这些调试信息得是我们打开了编译选项CONFIG_USB_STORAGE_DEBUG 才<br />

有意义的,这里也看出来了,如果这个选项为0,那么这几个宏就什么也不干,因为它们被赋为空了.<br />

关于US_DEBUG 系列的这几个宏,就讲这么多,之后再碰上,将直接过滤掉,不予多说.<br />

关于prink 和kmalloc,这两个函数也没有太多需要说的,对大多数人来讲,就把printk 当成<br />

printf,把kmalloc 当成malloc 即可,只不过是这两个函数是专门用于内核代码中的.一个是打印<br />

一些东西,一个是申请内存空间.<br />

931 行呢?id_index 干嘛用的?让我们在下节不见不散吧.Be there or be square!-孙楠如是<br />

说.<br />

设备花名册<br />

storage_probe 这个函数挺有意思的,总长度不足100 行,但是干了许多事情,这就像足球场上的后腰,比<br />

如<br />

切尔西的马克莱莱,在场上并不起眼,但是却为整个团队做出了卓越的贡献.也有很多评论家说银河战舰皇家<br />

马德里这几年的衰落正是从赶走这个不起眼的马克莱莱开始的.<br />

在讲id_index 之前,我们继续贴storage_probe 的代码:<br />

28<br />

943 init_MUTEX(&(us->dev_semaphore));

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

Saved successfully!

Ooh no, something went wrong!