|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
|
[?] lettura hard disk
qualcono sa come si puo leggere o scrivere sull' hard disk in modalita protetta quindi senza utilizzare gli interrupt del bios (int 13h). grazie per le vostre risposte |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
su Windows devi aprire l'unità fisica o logica utilizzando CreateFile, dopodiché leggi normalmente con ReadFile. nel caso di unità logica il formato del nome del file deve essere "\\\\.\\X:" dove X è la lettera dell'unità. nel caso invece di unità fisica il formato del nome deve essere "\\\\.\\PHYSICALDRIVEx", dove x è il numero dell'unità fisica.
|
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
|
Quote:
il mio problema è che sto provando a scrivere un "mini sistema operativo" a 32 bit ora dovrei leggere e scrivere sull 'hard disk ma non so come fare perche l' int 13 non funziona a 32 bit |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
- Implementare un tuo driver, in protected-mode, che "parla" direttamente con il controller dei dischi. - Switchare in real-mode, eseguire quello che ti serve e poi switchare nuovamente in protected-mode. Ovviamente la soluzione migliore sarebbe la prima.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Allego una guida rapida (non dettagliata, ma molto semplice).
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
|
grazie per la guida
ho provato a scrivere questo ma come immaginavo non funziona Codice:
outp(0X1f6,0x0); //drive 0 head 0
outp(0X1f2,0x1); //scrivi un settore
outp(0X1f3,0x02); //scrivi dal 2 settore
outp(0X1f4,0x00); //cilindro 0
outp(0X1f5,0x00); //cilindro 0
outp(0X1f7,0x30); //comando
do
{
/* wait until BSY signal is set to a 1 and DRQ is set to a 1 */
} while ( !inp(0x1f7) );
printf("scrivo");
int i;
for (i=0;i<512;i++)
{
outp(0x1f0,10); /* output 16-bits at a time */
}
quali sono gli errori? |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Ci sono alcuni errori: ad esempio, non devi leggere la porta 0x1F7 per attendere che il drive sia pronto, ma la porta 0x3F6.
Codice:
/* Attesa */
while ((inp(0x3F6) & (0x8 | 0x80)) != 0);
/* Cilindro */
outp(0x1F4, 0);
outp(0x1F5, 0);
/* Drive e testina */
outp(0x1F6, 0);
/* Numero di settori e settore iniziale */
outp(0x1F2, 1);
outp(0x1F3, 2);
/* Comando (lettura) */
outp(0x1F7, 0x20);
if ((inp(0x3F6) & 1) != 0) {
exit(-1);
}
/* Lettura di un settore di 512 byte, una word alla volta */
for (x = 0; x < (512 / 2); x++) {
buffer[x] = inp(0x1F0); // ** Attento: questo deve leggere una WORD, non un BYTE
}
L'esempio che ho scritto è per leggere dal disco, per scrivere è quasi lo stesso, cambia solo il comando (0x30) e l'ultima chiamata (ad esempio outportw() invece che inportw()). ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#8 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
mi fa piacere vederti così preparato sull'argomento Daniele
Db., sto arrivando... |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Faccio il possibile, ma ho ancora il solito ostacolo. Anzi, credo che chiederò qui sul forum...
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
|
grazie danielec88
ho provato funziona tutto perfettamente. adesso stavo provando a scrivere una funzione che mi converte gli indirizzi LBA in CHS. ho utilizzato queste formule per convertire unsigned short cilindri = (LBA/SecPerTrk)/HeadsPerCyl; unsigned char head = (LBA/SecPerTrk)% HeadsPerCyl; unsigned char settore = (LBA % SecPerTrk)+1; dove HeadsPerCyl = 16 SecPerTrk = 255 pero fino a LBA 255 funziona dopo scrive da tutt'altra parte. credo che le formule siano corrette ma le due costanti no |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Allora, se il disco supporta il LBA puoi usare anche indirizzi logici direttamente.
Per controllare se il disco supporta il LBA, manda il comando 0xEC al controller e leggi i 512 byte (256 word) che restituisce di ritorno, poi verifica che la sessantesima double word non sia uguale a zero: Codice:
DWORD info[128];
leggi_info(&info);
if (info[60] != 0) {
printf("LBA supportato");
}
Codice:
imposta_settore_iniziale(lba & 0xFF);
imposta_cilindro((lba & 0xFFFF00) >> 8);
imposta_drive_e_testina(HD0, (lba & 0xF000000) >> 24 | 0xE0); // questo 0xE0 dice al controller di usare il LBA
Codice:
DWORD tmp = (lba % (DRIVEHEADS * DRIVESECTORS));
hd_set_sector_start(tmp % hd0.DRIVESECTORS + 1);
hd_set_cylinder(lba / (DRIVEHEADS * DRIVESECTORS));
hd_set_drive_and_head(HD0, (tmp / DRIVESECTORS));
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:57.



















