Domanda Controller Hard Disk

lolollo2222

Utente Bronze
11 Novembre 2022
25
14
3
20
Ultima modifica:
Volevo provare tramite del codice C o assembly ad inviare dei comandi, il comando di identificazione dispositivo direttamente al mio Hard disk o al controller del mio hard disk sul datasheet del mio hard disk ho visto che come per moltri altri casi questo comando è 0xEC l'hard disk restituisce un blocco di dati grande 512 byte contentente tutte le info per fare ciò ovvero inviare comandi ATA devo configurare dei registri ma non so se sono registri del controller dell hard disk e quindi possono variare in base al produttore oppure sono registri fissi dettati dalla specifica ATA e che quindi sono gli stessi per tutti qualcuno ha esperienza ?
Messaggio unito automaticamente:

Volevo provare tramite del codice C o assembly ad inviare dei comandi, il comando di identificazione dispositivo direttamente al mio Hard disk o al controller del mio hard disk sul datasheet del mio hard disk ho visto che come per moltri altri casi questo comando è 0xEC l'hard disk restituisce un blocco di dati grande 512 byte contentente tutte le info per fare ciò ovvero inviare comandi ATA devo configurare dei registri ma non so se sono registri del controller dell hard disk e quindi possono variare in base al produttore oppure sono registri fissi dettati dalla specifica ATA e che quindi sono gli stessi per tutti qualcuno ha esperienza ?
AGGIORNATO: credo di aver trovato una risorsa utile premendo Win + X andando nella gestione dispositivi ed espandendo controller ATA/ATAPI ho visto che il mio pc utilizza un controller AHCI SATA Standard vedendo su questo sito super utile : https://wiki.osdev.org/AHCI#AHCI_Registers_and_Memory_Structures ho visto che parla di registri e fa esempi completi con il codice se a qualcuno interessa puo guardare ancora devo capire come inviare il comando 0xEC se riesco vi faccio sapere inoltre penso di essere abbastanza sicuro del fatto che la comunicazione tra la CPU e l' hard disk ha come intermediario il controller
 
Volevo provare tramite del codice C o assembly ad inviare dei comandi, il comando di identificazione dispositivo direttamente al mio Hard disk o al controller del mio hard disk sul datasheet del mio hard disk ho visto che come per moltri altri casi questo comando è 0xEC l'hard disk restituisce un blocco di dati grande 512 byte contentente tutte le info per fare ciò ovvero inviare comandi ATA devo configurare dei registri ma non so se sono registri del controller dell hard disk e quindi possono variare in base al produttore oppure sono registri fissi dettati dalla specifica ATA e che quindi sono gli stessi per tutti qualcuno ha esperienza ?
Messaggio unito automaticamente:


AGGIORNATO: credo di aver trovato una risorsa utile premendo Win + X andando nella gestione dispositivi ed espandendo controller ATA/ATAPI ho visto che il mio pc utilizza un controller AHCI SATA Standard vedendo su questo sito super utile : https://wiki.osdev.org/AHCI#AHCI_Registers_and_Memory_Structures ho visto che parla di registri e fa esempi completi con il codice se a qualcuno interessa puo guardare ancora devo capire come inviare il comando 0xEC se riesco vi faccio sapere inoltre penso di essere abbastanza sicuro del fatto che la comunicazione tra la CPU e l' hard disk ha come intermediario il controller
Tu dici? E io che pensavo le periferiche parlassero con la CPU attraverso la via Lattea :asd:
Resta il fatto che non riesco a capire se il tuo post sia troll o altro...

Nemmeno una virgola su 10 e passa righe :V
 
Non puoi comunicare direttamente con le periferiche hardware da un normale programma: devi farlo da un modulo kernel del sistema operativo. Su Windows i driver possono usare le funzioni Hal* (Hardware Abstraction Layer) ma devi mettere l'OS in test mode altrimenti è richiesta una firma digitale aziendale e una controfirma di Microsoft, per cui se vuoi sperimentare ti consiglio di farlo con Linux dove puoi compilare il tuo kernel in autonomia, infatti il link di AHCI che hai postato è per l'implementazione nel kernel.
 
Ultima modifica:
Tu dici? E io che pensavo le periferiche parlassero con la CPU attraverso la via Lattea :asd:
Resta il fatto che non riesco a capire se il tuo post sia troll o altro...

Nemmeno una virgola su 10 e passa righe :V
eh beato a te che già lo sapevi io l'ho imparato da poco, non è un post troll sto solo cercando di capire come fare, il concetto è che dovrei accedere all'area di memoria del mio pc dove sono mappati gli indirizzi di memoria dei registri del mio controller solo che non ho modo di vedere il datasheet di quest'ultimo
Messaggio unito automaticamente:

Non puoi comunicare direttamente con le periferiche hardware da un normale programma: devi farlo da un modulo kernel del sistema operativo. Su Windows i driver possono usare le funzioni Hal* (Hardware Abstraction Layer) ma devi mettere l'OS in test mode altrimenti è richiesta una firma digitale aziendale e una controfirma di Microsoft, per cui se vuoi sperimentare ti consiglio di farlo con Linux dove puoi compilare il tuo kernel in autonomia, infatti il link di AHCI che hai postato è per l'implementazione nel kernel.
Va bene grazie approfondisco, che tu sappia gli indirizzi di memoria che vedo in questa immagine sono quelli che mi potrebbero interessare ?
 

Allegati

  • Screenshot (43).png
    Screenshot (43).png
    116.5 KB · Visualizzazioni: 5
  • Screenshot (46).png
    Screenshot (46).png
    114.5 KB · Visualizzazioni: 4
Va bene grazie approfondisco, che tu sappia gli indirizzi di memoria che vedo in questa immagine sono quelli che mi potrebbero interessare ?

Che siano quelli o meno non importa, non puoi accedere alle aree di memoria usate dall'hardware, nè per leggere nè per scrivere. Ti consiglio di approfondire la gestione della memoria virtuale per proseguire. Dagli screenshot vedo che usi Windows e come ti ho detto su quell'OS è necessario sviluppare un driver kernel per accedere alla RAM fisica e usare le API del driver StorPort (da cui ottenere i veri indirizzi fisici per i device). Lo sviluppo kernel non è mai cosa semplice quindi se vuoi proseguire ti consiglio di farlo su Linux, con Windows in più devi studiare molti driver intermedi complessi e closed source, seguendo per forza la sua architettura.
 
Con tutta franchezza, ci potresti spiegare a cosa ti servirebbe, praticamente, tutto ciò in un tuo programma? Per fare cosa?
Semplicemente per verificare se ho capito questa parte di come funziona un hard disk, come si interfaccia con il processore tramite il controller facendo della pratica e scrivendo codice C, è pur sempre un qualcosa che fa parte del mondo dei sistemi operativi quindi come sono fatti e come funzionano seguirò il consiglio di JunkCoder approfondendo il kernel linux i driver ecc dato che c'è molta documentazione e risorse
 
Beh... non sei stato molto franco....
Mai sentito uno che vuole fare esperienza di programmazione kernel specificatamente sugli hard disk senza un motivo preciso.

In passato ho scritto device driver per Windows per l'accesso specifico all'I/O parallelo proprio per gestire direttamente alcuni device hardware, ma il motivo era preciso.

Se vuoi ottenere info dagli hd forse ti basta WMI in modalità user e non kernel
 
  • Mi piace
Reazioni: lolollo2222