Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Парковка головок винчестера


Автор: smalcom 23.1.2007, 17:20
есть необходимость програмно отгонять головки в зону парковки, а потом при чтении они по идее опять вернуться туда куда им надо над блинам после чтения инфы я их опять припаркую и так пока невыключат свет.
Винт работает в условиях что прочтенная с него информация превращается в вибрацию и жеивет он в среднем год изза таких издевательств. вот хачу облегчить ему жизнь. пробовал поискать по нету, но там все про современные технологии, про то что головки сами паркуюца, но мне нада програмно. вот собсно все

Автор: MAKCim 23.1.2007, 17:31
скорее тебе в "assembler" надо, чем в *NIX

Автор: En_t_end 23.1.2007, 17:47
smalcom, 
Есть большая вероятность, что эту работу выполняет контролер самого жесткого диска. Т.е. через стандартный интерфейс обмена ЖЕСТКИЙ ДИСК<->КОНТРОЛЕР(PC), врядли, удасться управлять этой функцией.

Автор: smalcom 23.1.2007, 18:32
я помню в какойто книжке или фаронова или еще когото был примерчик на асме как парковать головки, качнул седня фаронова - ненашел. учитывая что я под рутом то ассемблерные вставки очень вполне, но незнаю какие порты и что куда. а за идею по асму сенкс ща копну по этой теме на сайтах.

Автор: MAKCim 23.1.2007, 19:30
Цитата

учитывая что я под рутом то ассемблерные вставки очень вполне, но незнаю какие порты и что куда.

рут здесь не поможет, тебе надо ring0, чтобы в порты писать из protected mode, т. е без модуля ядра не обойтись

Автор: Goganchic 24.1.2007, 15:58
По-моему, все это само делается, так что нет необходимости что-либо писать, а потом если свет выключат во время чтения то ничего все равно не поможет.

Автор: smalcom 24.1.2007, 23:18
Цитата

рут здесь не поможет, тебе надо ring0, чтобы в порты писать из protected mode, т. е без модуля ядра не обойтись


у мня программа пишет и читает в порты COM,LPT.

Цитата

По-моему, все это само делается, так что нет необходимости что-либо писать, а потом если свет выключат во время чтения то ничего все равно не поможет.

ээх, мне от вибрации во время работы нада защитится - сабвуфер недолеко от винта - такой конструктив


посарел я немного в нете - делается это через инты биоса, но блин неудобно.
был на васм.ру там пример как низком уровни читать инфу с винта итд. ладно еще раз изучу доку буду добить контролер винта

Автор: nickless 24.1.2007, 23:56
Цитата(smalcom @ 24.1.2007,  22:18)
ээх, мне от вибрации во время работы нада защитится - сабвуфер недолеко от винта - такой конструктив

А не вариант подвесить винт на резине и окружить чем-нибудь шумоподавляющим? Всё же меньше вибрация будет.

Автор: kirjanov 25.1.2007, 10:08
тест на парковку
Цитата

t isn't too pretty to rely on such unreliable timing anyways. I'm 
>>>>not too crazy about spinning the disk down either, it's useless wear 
>>>>compared to just parking the head.
>>>
>>>Fully agreed, and that's the approach the IBM Windows driver seems to
>>>take - you just hear the disk park its head when the sensor kicks in
>>>(you can hear it) - the disk does not spin down when this happens.
>>>
>>>Could this be some reserved ATA command that only works with certain#
>>>drives?
>>
>>Perhaps the IDLE or IDLEIMMEDIATE commands imply a head parking, that
>>would make sense. As you say, you can hear a drive parking its head.
>>Here's a test case, it doesn't sound like it's parking the hard here.
> 
> 
> ATA7 defines a park maneuvre, I don't know how well supported it is yet
> though. You can test with this little app, if it says 'head parked' it
> works. If not, it has just idled the drive.

Код

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/ioctl.h>
#include <linux/hdreg.h>
 
int main(int argc, char *argv[])
{
    unsigned char buf[8];
    int fd;
 
    if (argc < 2) {
        printf("%s <dev>\n", argv[0]);
        return 1;
    }
 
    fd = open(argv[1], O_RDONLY);
    if (fd == -1) {
        perror("open");
        return 1;
    }
 
    memset(buf, 0, sizeof(buf));
    buf[0] = 0xe1;
    buf[1] = 0x44;
    buf[3] = 0x4c;
    buf[4] = 0x4e;
    buf[5] = 0x55;
 
    if (ioctl(fd, HDIO_DRIVE_TASK, buf)) {
        perror("ioctl");
        return 1;
    }
 
    if (buf[3] == 0xc4)
        printf("head parked\n");
    else
        printf("head not parked %x\n", buf[3]);
 
    close(fd);
    return 0;
 }


Еще интересное по HDIOCTL
http://developer.osdl.org/dev/robustmutexes/src/fusyn.hg/Documentation/ioctl/hdio.txt
@
вот патчик  =)
http://www.uwsg.iu.edu/hypermail/linux/kernel/0612.1/0568.html

Автор: Goganchic 27.1.2007, 12:03
А все же, проблему надо решать не программно, а аппаратно.

Автор: smalcom 6.2.2007, 17:05
полазил по нету никак не могу найти список АТА команд

Автор: regis 6.3.2007, 13:07
А может, вполне достаточно прочитать логический сектор #0 с диска? Тогда, по идее, головки должны выйти на нулевую дорожку.
Впрочем, в современных ОС с кешированием данные все равно будут читаться из кеша, а не физически с носителя.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)