阅读:2026回复:6
linux下如何读取硬盘参数
我在linux下想读取硬盘参数,如硬盘序列号,怎么读?请大虾帮帮我吧
|
|
沙发#
发布于:2001-09-27 10:38
在应用层,(需有Root权限),open(/dev/hda ...)之后,然后就可以调用read来读,以扇区为单位。
在内核层, 1,利用bread函数 2,若是ide设备,可直接读ide controller,利用PIO方式。为避免冲突,最好不要用这种方式。 Matt Wu |
|
|
板凳#
发布于:2001-09-27 10:46
多谢您的帮助,我想再问硬盘参数到底存在哪个扇区?结构如何?
|
|
地板#
发布于:2001-09-27 11:13
你要做的是应用程序还是driver?
硬盘参数不存在于磁盘上,而是在controller上。 应用程序:用ioctl,cmd=HDIO_GETGEO driver: 如果是做文件系统的driver,这不是问题,其它的有点麻烦。 Matt Wu |
|
|
地下室#
发布于:2001-09-28 17:17
我想读取ide的序列号,就是厂家写入的序列号,是关于一个加密问题。我看了ide controller的数据结构,没看到相关项,还请大虾再次指点,我是2。2。14内核!不胜感激。
|
|
5楼#
发布于:2001-09-29 10:16
序列号只有每个分区会有,硬盘的控制电路上存有的是硬盘的型号。
分区的序列号存放在该分区的第一扇区,是在创建分区时赋的随机值,不过要根据分区类型才能得到。硬盘的型号的获取,就只有通过ioctl或直接ata pio,对于同一类型的硬盘这个型号是一样的。 |
|
|
6楼#
发布于:2001-09-30 11:59
根据ATA-3的规范,流程如下: (以primary ide controller为例)
//Select Device outb(0x1f0 + 0x06, 0xa0 + secondary ? 0x10: 0); outb(0x1f0 + 0x07, 0xec); //向CMD_REG发送IDENTIFY_DEVICE指令。 while (inb(0x1f0 + 0x07) & 0x80) delay(); for(int i=0;i<256;i++) ??? = inw(0x1f0); // 共256个word,偏移10 - 19为serial number. 你可参考一下ata-3 spec。不过我认为这样直接在多任务系统中操纵ide controller不太好。你好通过ioctl: HDIO_GET_IDENTITY来获取。 你在linux下读取时,是通过kernel module(driver)还是直接在应用层做的。在应用层做与ide有关的端口操作可能会有问题,对此我不能肯定。 [matt 编辑于 2001-10-08 10:34] |
|
|