+ Responder ao Tópico



  1. #1

    Padrão acessar hardware por programa em ´c´, compilador gcc

    :?
    não tenho idéia de por onde começar: como se faz para acessar o hardware, a partir de um programa qualquer, em ´c´, com compilação pelo gcc?

    explico: quero acessar DIRETAMENTE um floppy para leitura ´raw data´ ou mesmo destruir a trilha zero de um hd sobrescrevendo-a com FFFF (risos).. alguém tem idéia de qual a lib a ser utilizada?

  2. #2
    ABG
    Visitante

    Padrão Re: acessar hardware por programa em ´c´, compilador gcc

    Vou te ajudar até onde posso.

    Nos sistemas Unix praticamente tudo é considerado um arquivo portanto se vc quer ler o prinmeiro setor do hd, supondo que o seu harddisk seja reconhecido como hda (poderia ser hdb, sda, sdb, eda, edb, basta apenas fazer:

    fd=open("/dev/hda",O_RDWR);
    read(fd, buff, 512);

    Se quiser ler outro setor qualquer deverá posicionar o ponteiro de arquivo no setor correto

    lseek(fd, Numero_do_setor * 512) e só depois fazer a leitura ok?

    Para escrever utilize a primitiva write().

    Observe que /dev/hda corresponde a todo o disco rígido, se quiser manipular um determinada partição em seu disco use /dev/hda1, /dev/hda5. etc.. Em resumo
    /dev/[nome_dispositivo][numero_partição].

    Com relação a manipulação do disquete, creio que o dispositivo correspondente seja /dev/fd0.

    para entender um pouco mais sobre dispositivos leia : http://www.nautilus.com.br/~rei/mate...nel-linux.html

    No que diz respeito a entrada e saida do tipo "raw", eu entendo isso como entrada e saida não buferizada, isto direta.

    Existe um mecanismo para isso que é utiliza uma técnica conhecida como raw devices, leia mais sobre isso aqui http://www.tldp.org/HOWTO/SCSI-2.4-HOWTO/rawdev.html.
    Com esta técnica vc anexa um dispositivo de bloco a outro de caracter e faz entrada e saída direta.

    Outra opção é abrir o dispositivo com a opção O_DIRECT (não sei se funciona para disquetes) e efetuar as alterações. Observe que ao usar O_DIRECT na primitiva Open() vc precisa garantir que o buffer seja um múltiplo do tamanho do bloco de dispositivo, que o início do buffer esteja alinhado com esse tamanho na memória ( se não me engano vc deverá usa memalign() para alocar memória nessas condições) e lseek deve sempre posicionar sobre um deslocamente múltiplo daquele tamanho.

    open("/dev/hda",O_RDWR|O_DIRECT)

    Não verifiquei se as chamadas as funções aqui mostradas estão corretas faça isso consultando a página da GLIBC em http://www.gnu.org/software/libc/manual/ , lá vc pode baixa-la também.


    Espero ter sido útil, se tiver alguma dúvida poste-a aqui, se eu puder ajudar o farei.