每次我启动FreeBSD的时候,都会在dmesg中出现下面的错误:
ad1s1a: UDMA ICRC error reading fsbn 255 of 96-127 (ad1s1 bn 255; cn 0 tn 4 sn 3) retrying
呵呵,可不是只出现一行,而是出现一打。有时,在控制台上还会反复出现。这时怎么回事?以前没时间处理它,现在可要研究研究了。上网查查,基本上没有什么结果。看看man吧。man ata。ata是ATA/ATAPI控制器的驱动。它说ata总是尝试使用控制器通道的最高速率来初始化。在我的机器上就是udma66。如果初始化失败,它会把相应的通道降到PIO模式。这就是上面那个错误的原因。但是可以使用atacontrol来控制。使用atacontrol mode 0命令看看,我的IDE1果然工作在PIO4模式。我的BIOS告诉我,我的IDE1是udma33,使用atacontrol mode 0 1 udma33后,我的IDE1控制器,回到了udma33模式。但我不知道,pio4和udma33在FreeBSD上的速度到底有多达的差距。我写了一个perl脚本来测算速度,脚本如下:
#!/usr/bin/perl
`rm Looking.rar`;
$t = time();
`cp /usr/Looking.rar .`;
$t = time() - $t;
print "$t\n";
Looking.rar这个文件有270M。我记录下了两种模式下运行该脚本的时间。
REBOOT后第一次运行的速度 多次运行后的速度
PIO4 57秒 29秒
UDMA33 27秒 11秒
这个速度上的差距真的是非常惊人。但我不知道如何强制ata在udma模式下运行,只好写了一个脚本放到/usr/local/rc.d下,该脚本叫ata.sh,内容如下:
/sbin/atacontrol mode 0 1 udma33
/sbin/atacontrol mode 1 1 udma33
尽管那些错误在启动的时候依然存在,但我的心里感觉好多了。