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));