使用libata从用户空间应用程序在HDD上执行ATA命令

时间:2013-06-28 14:02:46

标签: c linux ata

我想使用libata从用户空间应用程序向我的HDD(它是一个SATA驱动器)发送ATA命令(最终,任何支持的ATA命令)(这是可能的,对吧?)。 我一开始会感到高兴的是预先形成ATA命令识别设备并打印出这些数据。不幸的是,我没有找到任何这样的例子。在libata中[完全在文件libata-core.c(linux-2.6.39 / drivers / ata /)]中有一个函数ata_dev_read_id [第1860行,在我的源代码中较少],它可以实现我想要的功能。问题是它作为ata_device的参数指针之一,我不知道如何初始化它。 我阅读了一些libATA开发人员指南(http://www.hep.by/gnu/kernel/libata/index.html),但它并没有为我清楚。我认为示例源代码将对我有所帮助。任何人都可以提供这样的例子(核心资源就足够了,不需要错误检查等等)。实际上我想要的是一个源代码,它将执行类似http://www.tldp.org/HOWTO/SCSI-Generic-HOWTO/pexample.html的操作,但不使用sg.h ioctl我想使用libata。 我知道我可以使用SCSI命令ATA Pass-Through。 或者相反,也许有人知道任何开源工具,使用libATA的应用程序,我可以看到它是如何在那里使用的?

2 个答案:

答案 0 :(得分:2)

开源工具SmartMonTools进行了大量的低级ATA处理。也许这可以指出你正确的方向。 http://sourceforge.net/apps/trac/smartmontools/wiki

答案 1 :(得分:0)

LibATA在内核模式下实现,用于处理与ATA驱动器相关的不同功能。

如果要使用libATA功能,则必须编写自己的内核模块,然后将ioctl方法公开给用户空间。

更好的方法是使用ATA Passthrough相关API将命令发送到ATA驱动器,Smart Mon Tools和hdparam使用相同的方法。