3.3.5 配置硬盘控制器驱动
一般而言,PC的根文件系统都保存在硬盘上,因此,我们需要配置内核的硬盘驱动。在笔者写作这本书时,大多数现代PC都使用SATA接口的硬盘,SATA硬盘基本已经全面取代了IDE硬盘。因此,我们以SATA硬盘为例,讨论内核中硬盘驱动的配置。关于SATA控制器驱动的配置,需要从三个方面考虑。
(1)硬盘控制器的接口
SATA控制器使用的是PCI接口,挂在PCI总线上,所以首先需要配置内核支持PCI总线。
可以使用lspci命令查看SATA硬盘的相关信息。下面以笔者机器为例,执行lspci命令输出的关于SATA控制器的相关信息:
显然,在0号PCI总线上,有一个SATA控制器,工作模式为AHCI,使用的内核驱动是ahci。
(2)与SCSI层之间的关系
在内核中,SATA设备被实现为一个SCSI设备,如图3-11所示。
图 3-11 SATA子系统结构
因此,虽然目标机器上可能没有SCSI设备,但是如果要支持SATA控制器,内核也要配置支持SCSI。
(3)底层设备驱动
在图3-11中,内核将SATA驱动从逻辑上划分为两层:
❑SATA Translation,这一层负责SCSI和SATA协议之间的翻译,在SATA驱动中被封装为libata模块。
❑Low Level Device Driver,在SATA Translation层下,是直接面对设备的底层驱动。很多SATA控制器均提供两种可选模式:一种是模拟传统的IDE,通常称为Compatibility模式,这种模式是为了向后兼容那些较早的不支持SATA的操作系统;另外一种是AHCI模式,这种模式可以提供更好的性能及传输速度。对于Intel的SATA控制器来说,内核为这两种不同的模式分别实现了驱动:ata_piix和ahci。ata_piix驱动用于Compatibility模式,ahci驱动用于AHCI模式。
从kbuild中有关SATA的Kconfig中,我们也可以清楚地看到SATA控制器对PCI和SCSI的依赖:
先看配置项ATA,正如配置中的描述"Serial ATA and Parallel ATA drivers",这一项对应于SATA和PATA设备。注意其中用黑体标识的部分,这一配置项是依赖SCSI的而且ATA是选择(select)依赖SCSI。也就是说,一旦配置内核支持ATA设备,kbuild将自动选中内核的SCSI支持。
再来看配置项SATA_AHCI和ATA_PIIX,这两项对应的就是前面所说的SATA控制器的驱动,SATA_AHCI用于驱动AHCI模式,ATA_PIIX用于驱动Compatibility模式。根据上面我们用黑体标示的部分,可以清楚地看到,这两项均要求内核支持PCI总线。
下面我们就具体配置这三个部分。
1.配置PCI总线
因为SATA控制器使用的是PCI接口,所以我们首先来配置内核支持PCI总线。
1)执行make menuconfig,出现如图3-12所示的界面。
图 3-12 配置PCI总线(1)
2)在图3-12中,选择菜单项"Bus options",出现如图3-13所示的界面。
图 3-13 配置PCI总线(2)
3)在图3-13中,选中菜单项"PCI support"。PCI总线配置完毕。
2.配置SCSI
接下来配置SCSI。
1)执行make menuconfig,出现如图3-14所示的界面。
图 3-14 配置SCSI(1)
2)在图3-14中,选择菜单项"Device Drivers",出现如图3-15所示的界面。
图 3-15 配置SCSI(2)
3)在图3-15中,选择菜单项"SCSI device support",出现如图3-16所示的界面。
图 3-16 配置SCSI(3)
4)在图3-16中,选中"SCSI device support"和"SCSI disk support",注意将它们都编译进内核,而不是编译为模块。SCSI配置完毕。
3.配置SATA控制器驱动
下面来配置SATA控制器驱动。
1)执行make menuconfig,出现如图3-17所示的界面。
图 3-17 配置SATA控制器驱动(1)
2)在图3-17中,选择菜单项"Device Drivers",出现如图3-18所示的界面。
图 3-18 配置SATA控制器驱动(2)
3)在图3-18中,选择"Serial ATA and Parallel ATA drivers"(注意将它编译进内核,而不是编译为模块),出现如图3-19所示的界面。
图 3-19 配置SATA控制器驱动(3)
4)笔者的机器使用的是Intel SATA控制器,所以选择图3-19中的"AHCI SATA support"和"Intel ESB,ICH,PIIX3,PIIX4 PATA/SATA support"。前者是工作在AHCI模式的Intel SATA控制器的驱动,后者是工作在Compatibility模式的Intel SATA控制器的驱动。注意将它们也都编译进内核。
至此,SATA控制器的驱动配置完成。接下来我们编译内核,并将编译好的内核保存在目标系统的根文件系统的boot目录下。
下面测试新编译的内核。首先在虚拟机的sda2分区上创建boot目录,用来存放内核映像:
将新编译的内核复制到虚拟机:
并在虚拟机GRUB的配置文件中添加如下启动项:
注意将虚拟机的GRUB的配置文件grub.cfg中的timeout都设置为一个正值,比如5s,这样GRUB才会给我们机会选择引导哪个系统。
然后重新启动并进入vita系统,运行结果如图3-20所示。
图 3-20 配置SATA控制器驱动后内核运行情况
根据内核的输出信息可见,内核已经正确识别了SATA硬盘。但是因为没有找到合适的文件系统挂载sda2分区,所以在“抱怨”"No filesystem could mount root"后出现了"panic"。因此,在下一小节,我们配置内核对文件系统的支持。