云上的老鼠

云上的日子

  DonewsBlog  |  Donews首页  |  Donews社区  |  Donews邮箱  |  我的首页  |  联系作者  |  聚合   |  登录
  76篇文章 :: 0篇收藏:: 61篇评论:: 0个Trackbacks

公告

这是quickmouse的blog哟

^______^

文章的转载请保留全文以及注明出处,谢谢合作!

文章

收藏

相册

常用链接

我的联系方式

友情推荐

主人推荐

存档


正在读取评论……


by QuickMouse (quickmouse@263.net) 2005年11月18日

    很早就知道Linux下可以用hdparm调整IDE硬盘的参数,设置传输速率、DMA等等,但是一直都没有尝试过,昨天终于忍不住要设置一下。原因很简单,因为我发现自己编译的最小系统(U盘上的应急拯救系统)对IDE硬盘的读取速度只有4MB/s。硬盘对硬盘的复制像开老爷车一样的,郁闷 :-( 。
    于是从其他机器上复制一个hdparm过来,参考着用hdparm -d1 -X69 -c3 /dev/hda对IDE上的PATA硬盘进行设置。UDMA100和32bit传输都一切正常的设置了,唯独对DMA的设置失败,提示为:
HDIO_SET_DMA failed: Operation not permitted
    晕倒,用root居然还有权限不够的?用modprobe piix加载intel的IDE驱动,再试,结果依然。于是翻出kernel的源代码,寻找是哪个地方出现的问题。

    经过一番对比,在drivers/ide/ide.c的set_using_dma当中找到:
        if (!drive->id || !(drive->id->capability & 1))
                return -EPERM;
        if (HWIF(drive)->ide_dma_check == NULL)
                return -EPERM;

    看来问题是这里了。加上printk以后发现是后一句,也就是ide_dma_check的函数被判断为NULL,所以不允许执行设置DMA。可是我翻来覆去看piix.c这个intel的驱动,它的ide_dma_check明明已经指向了一个函数了呀。再次用printk,屏幕上出现的提示却表明当modprobe piix的时候驱动报ide0/ide1的端口已经被generic驱动注册了。看来事实上piix的驱动加载以后并没有起作用。
    用make menuconfig检查源码的设置,我是将"generic/default IDE chipset support"设置为yes,对于其他具体的芯片组的IDE驱动设置为模块支持。这样设置的想法是使得内核可以支持基本的IDE驱动,对于具体的芯片组如果有驱动我再加载对应的模块,以便得到更好的性能。从今天的现象看来这个思路是不正确的。在编译了generic IDE驱动以后,加载硬盘文件系统前,这个generic驱动就占据了ide端口,而后来的对应芯片组驱动即便加载也无法控制ide端口了。

    解决思路:
    1、将generic IDE编译为模块。这样带来的问题是,如果文件系统在硬盘上,即模块文件在硬盘,那么没有IDE驱动就根本无法挂载硬盘,更不用谈加载驱动了。除非用initrd.img在linuxrc当中挂载真实文件系统前加载对应的模块
    2、将generic IDE和其他的芯片组支持同时编译进内核。这样带来的问题是内核大小增加,但好处是可以支持所有的IDE接口,在内核发现有更好的芯片组支持时会自动采用对应的芯片组支持驱动,Redhat的内核就是这么干的,嘿嘿。我大致挑了intel、via、AMD、sis等四个主流的芯片组驱动编译进入内核,增加了15KBs的大小。看来还是可以接受的哦。
    经过测试,hdparm可以成功设置硬盘的DMA访问方式,传输速度达到50MB/s!

    结论:在定制Linux kernel对于IDE PATA硬盘的驱动支持的时候,generic IDE支持最好不要编译成模块方式,这样可以使得内核能够访问所有的IDE芯片组;同时,你所想要特别支持的芯片组也不要编译为模块方式,否则,当内核中的generic IDE初始化完成后再加载IDE芯片组的支持也无法起到你想要的效果。



Trackback: http://tb.donews.net/TrackBack.aspx?PostId=631168


[点击此处收藏本文]  发表于2005年11月18日 3:40 PM




正在读取评论……

发表评论

大名:
网址:
验证码
评论