有一天身子问心:"我要是痛了,医生会给我治,你痛了谁给你治啊?"于是心说:"我只能自己给自己治."也许因为这样,每个人都有一个治疗自己心中伤痛的方法.喝酒,唱歌,发火,或哭或笑,跟朋友诉苦,共旅行,跑马拉松,最差的一种方法是逃避这种心痛.我的方法是写这种伪技术的文章.
但是写些什么呢?既然有人写了USB,既然有人写了PCI,那么如果不写SCSI,恐怕是天理地理都难容了.
就说我们公司吧,机房里那么些服务器,哪台没有SCSI设备?SCSI硬盘,SCSI带库,各种各样的SCSI设备在机房里都能找到.机房里没有SCSI设备,就好比超级女声里没有张靓颖.不过我一直很好奇的想知道,之所以这些年SCSI总线这么火,是不是因为这总线和芙蓉姐姐的S线条一样迷人一样妩媚一样优雅?怀着这种好奇心,我开始了探索SCSI子系统的道路,不过让我们从简单的实例开始,这个简单的实例就是SCSI硬盘(SCSI DISK).
写SCSI硬盘驱动分析实际上也是对usb-storage的一个延续.SCSI硬盘驱动对应于一个模块,sd_mod.o.usb-storage要工作首先就得依赖于两个scsi的模块,一个是scsi核心模块scsi_mod.o,一个就是这个scsi硬盘的驱动模块sd_mod.o.
老套路,首先我们从drivers/scsi目录来看这个Kconfig文件中是如何描述scsi disk的.
58 config BLK_DEV_SD
59 tristate "SCSI disk support"
60 depends on SCSI
61 ---help---
62 If you want to use SCSI hard disks, Fibre Channel disks,
63 Serial ATA (SATA) or Parallel ATA (PATA) hard disks,
64 USB storage or the SCSI or parallel port version of
65 the IOMEGA ZIP drive, say Y and read the SCSI-HOWTO,
66 the Disk-HOWTO and the Multi-Disk-HOWTO, available from
67 <http://www.tldp.org/docs.html#howto>. This is NOT for SCSI
68 CD-ROMs.
69
70 To compile this driver as a module, choose M here and read
71 <file:Documentation/scsi/scsi.txt>.
72 The module will be called sd_mod.
73
74 Do not compile this driver as a module if your root file system
75 (the one containing the directory /) is located on a SCSI disk.
76 In this case, do not compile the driver for your SCSI host adapter
77 (below) as a module either.
这个”depends on SCSI”说的就是scsi core.毫无疑问,scsi跑得快,全凭core来带.所有的scsi模块都是基于scsi core的.
再来看Makefile,drivers/scsi目录下的Makefile,洋洋洒洒190行,但真正引起我们注意的是下面这几行,
140 obj-$(CONFIG_BLK_DEV_SD) += sd_mod.o
141 obj-$(CONFIG_BLK_DEV_SR) += sr_mod.o
142 obj-$(CONFIG_CHR_DEV_SG) += sg.o
143 obj-$(CONFIG_CHR_DEV_SCH) += ch.o
144
145 # This goes last, so that "real" scsi devices probe earlier
146 obj-$(CONFIG_SCSI_DEBUG) += scsi_debug.o
147
148 obj-$(CONFIG_SCSI_WAIT_SCAN) += scsi_wait_scan.o
149
150 scsi_mod-y += scsi.o hosts.o scsi_ioctl.o constants.o /
151 scsicam.o scsi_error.o scsi_lib.o /
152 scsi_scan.o scsi_sysfs.o /
153 scsi_devinfo.o
154 scsi_mod-$(CONFIG_SCSI_NETLINK) += scsi_netlink.o
155 scsi_mod-$(CONFIG_SYSCTL) += scsi_sysctl.o
156 scsi_mod-$(CONFIG_SCSI_PROC_FS) += scsi_proc.o
157
158 scsi_tgt-y += scsi_tgt_lib.o scsi_tgt_if.o
159
160 sd_mod-objs := sd.o
140行和160行,给了我们足够的惊喜.因为SCSI Disk的驱动只有一个文件,sd.c.咱们瞅一眼这个文件有多大,
localhost:/usr/src/linux-2.6.22.1/drivers/scsi # wc -l sd.c
1903 sd.c
区区1903行,当一个模块只有这么点长的时候,一路走来的兄弟们恐怕已经难以抑制内心那阵狂喜了吧.但我想提醒你的是,爱的魅力不在于对象的多寡,而在于程度的深浅;代码的魅力不在于行数的多寡,而在于背后哲学思想的深浅.
原文见:http://blog.csdn.net/fudan_abc/article/details/1907897