很久以前 , 天還是藍的 , 水也是綠的 , 莊稼是長在地裏的 , 豬肉是可以放心吃的 , 耗子還是怕貓的 , 法庭是講理的 , 上牀是先結婚的 , 理髮店是隻管理髮的 , 藥是可以治病的 , 醫生是救死扶傷的 , 拍電影是不需要陪導演睡覺的 , 照相是要穿衣服的 , 欠錢是要還的 , 孩子的爸爸是明確的 , 學校是不圖掙錢的 , 白癡是不能當教授的 , 賣狗肉是不能掛羊頭的 , 男就是男的女的就是女的 . 那時候 Block 層還是一部分附屬於 drivers/ 目錄下一部分附屬於 fs/ 目錄下的 .
但後來一切都變了 .2005 年秋天 ,Block 層搬出了 drivers/ 和 fs/ 目錄 , 從 2.6.15 的內核開始 , 頂層目錄下面有了一個叫做 block 的目錄 , 內核目錄結構變成了現在這個樣子 :
localhost-1:/usr/src/linux-2.6.22.1 # ls
COPYING Documentation MAINTAINERS README arch crypto fs init kernel mm scripts sound CREDITS Kbuild Makefile REPORTING-BUGS block drivers include ipc lib net security usr
進入 block 目錄 , 用旁光看一下 :
localhost:/usr/src/linux-2.6.22.1/block # ls
Kconfig Makefile blktrace.c deadline-iosched.c genhd.c ll_rw_blk.c scsi_ioctl.c
Kconfig.iosched as-iosched.c cfq-iosched.c elevator.c ioctl.c noop-iosched.c
用 wc 命令統計一下 :
localhost:/usr/src/linux-2.6.22.1/block # wc -l *
54 Kconfig
73 Kconfig.iosched
12 Makefile
1485 as-iosched.c
562 blktrace.c
2254 cfq-iosched.c
485 deadline-iosched.c
1160 elevator.c
831 genhd.c
304 ioctl.c
4117 ll_rw_blk.c
118 noop-iosched.c
654 scsi_ioctl.c
12109 total
一萬二千多行 . 還好我們不用每個文件都去看 .
老規矩 , 先看一下 Makefile 和 Kconfig,
localhost:/usr/src/linux-2.6.22.1/block # cat Makefile
#
# Makefile for the kernel block layer
#
obj-$(CONFIG_BLOCK) := elevator.o ll_rw_blk.o ioctl.o genhd.o scsi_ioctl.o
obj-$(CONFIG_IOSCHED_NOOP) += noop-iosched.o
obj-$(CONFIG_IOSCHED_AS) += as-iosched.o
obj-$(CONFIG_IOSCHED_DEADLINE) += deadline-iosched.o
obj-$(CONFIG_IOSCHED_CFQ) += cfq-iosched.o
obj-$(CONFIG_BLK_DEV_IO_TRACE) += blktrace.o
很顯然 , 經常在地鐵站裏吆喝着說劉德華死了的那位賣報的哥們兒也知道 , 這裏最重要的一個選項是 CONFIG_BLOCK, 而剩下幾個我們看一下 Kconfig 以及 Kconfig.iosched 就知道 , 是和 IO 調度算法有關的 , 並不一定每種算法都要清楚 , 看其中一種就湊合了 .
那麼整個 Block 子系統的入口在哪裏呢 ? 一路走來的兄弟相信不難找到 , 在 block/genhd.c 中有這麼一行 :
363 subsys_initcall(genhd_device_init);
所以很明顯 ,genhd_device_init 將爲我們掀開故事的大幕 .