Κεφάλαιο – 8
Λειτουργίες Disk-BIOS και χειρισμός διακοπών χρησιμοποιώντας το C
Εισαγωγή
Σε αυτό το κεφάλαιο θα συζητήσουμε τα σημαντικά χαρακτηριστικά του Disk-BIOS και άλλα σημαντικά χαρακτηριστικά που μας δίνουν την ελευθερία να χρησιμοποιούμε και να χειριζόμαστε διακοπές στο πρόγραμμά μας C με μια απλή και σύντομη μέθοδο. Αυτές οι λειτουργίες αποτελούν τη βάση του προγραμματισμού ανάκτησης δεδομένων και αντιμετώπισης προβλημάτων δίσκου. Αυτά είναι τα χαρακτηριστικά που κάνουν τη γλώσσα C μια "γλώσσα συναρμολόγησης υψηλού επιπέδου " .
Λειτουργίες biosdisk και _bios_disk
Αυτές οι δύο λειτουργίες είναι οι πιο σημαντικές για τον σκοπό μας για την ανάκτηση δεδομένων και τον προγραμματισμό αντιμετώπισης προβλημάτων δίσκου. Θα χρησιμοποιούμε αυτές τις λειτουργίες τις περισσότερες φορές.
Αυτές οι δύο λειτουργίες είναι υπηρεσίες μονάδας δίσκου BIOS και ορίζονται στο bios.h, όπου ο biosdisk λειτουργεί κάτω από το επίπεδο αρχείου σε ακατέργαστους τομείς. Εάν αυτές οι λειτουργίες χρησιμοποιούνται ακόμη και με την παραμικρή απροσεξία, μπορούν να καταστρέψουν τα περιεχόμενα των αρχείων και των καταλόγων του σκληρού σας δίσκου. Και οι δύο συναρτήσεις biosdisk και _bios_disk χρησιμοποιούν διακοπή 0x13 για να περάσουν τις λειτουργίες του δίσκου απευθείας στο BIOS. Η συνάρτηση _bios_disk δηλώνεται στο πρόγραμμα ως εξής:
unsigned _bios_disk(unsigned command, struct diskinfo_t *dinfo);
Και η δήλωση για τη λειτουργία δίσκου BIOS μοιάζει με αυτό:
int biosdisk(int cmd, int drive, int head, int track,
int sektor, int nsects, void *buffer);
Η σημασία αυτών των παραμέτρων περιγράφεται στον παρακάτω πίνακα:
Παράμετρος |
Λειτουργία |
Τι είναι ή τι κάνει |
cmd |
Και οι δύο |
Καθορίζει τη λειτουργία που θα εκτελεστεί, όπως ανάγνωση, εγγραφή, έλεγχος κ.λπ. (Δείτε την περιγραφή του cmd παρακάτω) |
dinfo |
_bios_disk |
Υποδεικνύει μια δομή diskinfo_t που περιέχει τις υπόλοιπες παραμέτρους που απαιτούνται για τη λειτουργία. (δείτε την περιγραφή της δομής diskinfo_t παρακάτω) |
οδηγούν ένα αυτοκίνητο |
biosdisk |
Καθορίζει ποιος δίσκος θα χρησιμοποιηθεί (0 για το a:, 1 για το b: και 0x80 για τον πρώτο φυσικό σκληρό δίσκο, 0x81 για τον δεύτερο κ.λπ.) |
τομέας τροχιάς
κεφαλής
|
biosdisk |
Καθορίζουν τη θέση του αρχικού τομέα από τον οποίο θα πρέπει να ξεκινήσει η λειτουργία. |
έντομα |
biosdisk |
Αριθμός τομέων για ανάγνωση, εγγραφή, έλεγχο κ.λπ. |
ρυθμιστής |
biosdisk |
Η διεύθυνση μνήμης από την οποία πρόκειται να διαβαστούν ή να γραφτούν τα δεδομένα. |
Και στις δύο αυτές συναρτήσεις, τα δεδομένα διαβάζονται και εγγράφονται σε μια προσωρινή μνήμη 512 byte ανά τομέα, που είναι το λογικό μέγεθος τομέα του σκληρού δίσκου, και η τιμή επιστροφής και από τις δύο συναρτήσεις είναι η τιμή του καταχωρητή AX που ορίστηκε από την κλήση του BIOS INT 0x13H.
Εάν η συνάρτηση είναι επιτυχής, το υψηλό byte = 0, που σημαίνει επιτυχής ολοκλήρωση, και το χαμηλό byte περιέχει τον αριθμό των τομέων που διαβάστηκαν, εγγράφηκαν ή επαληθεύτηκαν κ.λπ.
Ωστόσο, εάν παρουσιαστεί κάποιο σφάλμα και η συνάρτηση δεν εκτελεστεί με επιτυχία, η τιμή του high byte θα αντιστοιχεί σε έναν από τους ακόλουθους κωδικούς σφάλματος, οι οποίοι περιγράφονται στον παρακάτω πίνακα:
Αξία |
Περιγραφή |
0x00 |
Επιτυχής ολοκλήρωση (όχι σφάλμα!!) |
0x01 |
Κακή ομάδα |
0x02 |
Η ετικέτα διεύθυνσης δεν βρέθηκε |
0x03 |
Προσπάθεια εγγραφής σε δίσκο με προστασία εγγραφής |
0x04 |
Ο τομέας δεν βρέθηκε |
0x05 |
Η επαναφορά απέτυχε (σκληρός δίσκος) |
0x06 |
Ο δίσκος έχει τροποποιηθεί από την τελευταία λειτουργία. |
0x07 |
Απέτυχε η εκτέλεση της ενέργειας παραμέτρου μονάδας δίσκου |
0x08 |
Υπερχείλιση άμεσης πρόσβασης μνήμης (DMA). |
0x09 |
Προσπάθεια εκτέλεσης DMA σε όριο 64K (σφάλμα ορίου δεδομένων ή τομείς >80H) |
0x0A |
Εντοπίστηκε κακός τομέας |
0x0B |
Εντοπίστηκε κακό κομμάτι |
0x0C |
Μη υποστηριζόμενο κομμάτι |
0x0D |
Λανθασμένος αριθμός τομέων κατά τη μορφοποίηση (σκληρός δίσκος PS/2) |
0x0E |
Εντοπίστηκε σήμα διεύθυνσης δεδομένων ελέγχου (Σκληρός δίσκος) |
0x0F |
Επίπεδο διαιτησίας DMA εκτός εύρους (Σκληρός Δίσκος) |
0x10 |
Λανθασμένο CRC/ECC κατά την ανάγνωση του δίσκου |
0x11 |
Σφάλμα διόρθωσης δεδομένων CRC/ECC (δεν είναι πραγματικά σφάλμα) |
0x20 |
Το χειριστήριο είναι εκτός λειτουργίας |
0x31 |
Δεν υπάρχουν μέσα στη μονάδα δίσκου (επεκτάσεις IBM/MS INT 13) |
0x32 |
Εσφαλμένος τύπος δίσκου αποθηκευμένος στο CMOS (Compaq) |
0x40 |
Η επιχείρηση αναζήτησης απέτυχε. |
0x80 |
Το συνημμένο δεν απάντησε |
0xAA |
Ο δίσκος δεν είναι έτοιμος (μόνο ο σκληρός δίσκος) |
0xB0 |
Ο τόμος δεν είναι κλειδωμένος στο δίσκο (επεκτάσεις INT 13) |
0xB1 |
Κλειδωμένος τόμος στο δίσκο (επεκτάσεις INT 13) |
0xB2 |
Μη αφαιρούμενος τόμος (επεκτάσεις INT 13) |
0xB3 |
Όγκος χρήσης (επεκτάσεις INT 13) |
0xB4 |
Υπέρβαση αριθμού κλειδαριών (INT 13 επεκτάσεις) |
0xB5 |
Απέτυχε η εκτέλεση έγκυρου αιτήματος ρίψης (επεκτάσεις INT 13) |
0xBB |
Παρουσιάστηκε απροσδιόριστο σφάλμα (μόνο σκληρός δίσκος) |
0xCC |
Παρουσιάστηκε σφάλμα εγγραφής |
0xE0 |
Σφάλμα εγγραφής κατάστασης |
0xFF |
Το Operation Sense απέτυχε |
Ο παρακάτω πίνακας παρουσιάζει τις εντολές λειτουργίας που πρέπει να εκτελεστούν από την παράμετρο cmd. Πρώτα απ 'όλα, θα δούμε τις γενικές λειτουργίες και των δύο συναρτήσεων.
biosdisk |
_bios_disk |
Τι κάνει; |
0 |
_DISK_RESET |
Επαναφέρει το σύστημα του δίσκου, αναγκάζοντας τον ελεγκτή μονάδας να κάνει μια σκληρή επαναφορά. Αγνοήστε όλες τις άλλες παραμέτρους |
1 |
_DISK_STATUS |
Επιστρέφει την κατάσταση της τελευταίας λειτουργίας του δίσκου. Αγνοεί όλες τις άλλες παραμέτρους |
2 |
_DISK_READ |
Διαβάζει έναν ή περισσότερους τομείς δίσκου στη μνήμη |
3 |
_DISK_WRITE |
Γράφει έναν ή περισσότερους τομείς δίσκου από τη μνήμη |
4 |
_DISK_VERIFY |
Επαληθεύει έναν ή περισσότερους τομείς |
5 |
_DISK_FORMAT |
Μορφοποιεί ένα κομμάτι |
Αν και μπορείτε ελεύθερα να χρησιμοποιήσετε είτε cmd = 0, 1, 2, 3, 4,5 ή cmd = _DISK_RESET, _DISK_STATUS, _DISK_READ, _DISK_WRITE, _DISK_VARIFY, _DISK_FORMAT και και οι δύο επιλογές έχουν το ίδιο αποτέλεσμα, αλλά συνιστάται να χρησιμοποιήσετε τις λέξεις _cmDI για την συνήθεια = 5 γιατί μπορεί να σας βοηθήσει να αποφύγετε σφάλματα που ενδέχεται να προκύψουν εάν έχετε πληκτρολογήσει λάθος αριθμό εντολής για το cmd.
Στη δήλωση της συνάρτησης biosdisk ή _bios_disk αν δώσουμε το cmd = _DISK_RESET η συνάρτηση επαναφέρει το σύστημα του δίσκου αγνοώντας όλες τις άλλες παραμέτρους και το _DISK_STATUS επιστρέφει την κατάσταση της τελευταίας λειτουργίας δίσκου, αγνοώντας όλες τις άλλες παραμέτρους
Για τις συναρτήσεις cmd =_DISK_READ, _DISK_WRITE ή _DISK_VERIFY (2, 3 ή 4), οι συναρτήσεις biosdisk και _bios_disk χρησιμοποιούν επίσης άλλες παραμέτρους που φαίνονται παρακάτω:
Παράμετρος |
Τι κάνει |
τομέας κεφαλής
τροχιάς
|
Αυτά τα τρία καθορίζουν τη θέση του αρχικού τομέα για την καθορισμένη λειτουργία. (οι ελάχιστες δυνατές τιμές μπορεί να είναι head = 0, track = 0 και τομέας =1) |
nτομείς |
Αυτό καθορίζει τον αριθμό των τομέων προς ανάγνωση ή εγγραφή |
ρυθμιστής |
Δείχνει στην προσωρινή μνήμη όπου πρόκειται να διαβαστούν και να γραφτούν τα δεδομένα |
Εάν η τιμή του cmd είναι = 5 (_DISK_FORMAT), το biosdisk και το _bios_disk χρησιμοποιούν τις ακόλουθες παραμέτρους σύμφωνα με την περιγραφή στον πίνακα. Συνιστάται πάντα να προσέχετε όσο χρησιμοποιείτε το _DISK_FORMAT και θα πρέπει να γνωρίζετε τι θα κάνετε. Η έλλειψη γνώσης ή ακόμα και ένα μικρό λάθος μπορεί να σας κάνει να αντιμετωπίσετε μεγάλη απώλεια δεδομένων.
Παράμετρος |
Τι κάνει |
τροχιά κεφαλής |
Αυτά καθορίζουν τη θέση του κομματιού προς διαμόρφωση |
ρυθμιστής |
Δείχνει έναν πίνακα με κεφαλίδες τομέα που πρέπει να γραφτούν στο ονομαζόμενο κομμάτι |
Υπάρχουν κάποιες πρόσθετες τιμές του cmd που χρησιμοποιούνται μόνο από τις λειτουργίες του biosdisk. Αυτές οι τιμές cmd επιτρέπονται μόνο για τα XT, AT, PS/2 και συμβατά. Οι τιμές έχουν περιγραφεί στον παρακάτω πίνακα:
cmd |
Τι κάνει |
6 |
Μορφοποιεί ένα κομμάτι και ορίζει σημαίες κακού τομέα |
7 |
Μορφοποιεί τη μονάδα δίσκου που ξεκινά από ένα συγκεκριμένο κομμάτι |
8 |
Επιστρέφει τις τρέχουσες παραμέτρους μονάδας δίσκου στα πρώτα 4 byte του buffer |
9 |
Αρχικοποιεί τα χαρακτηριστικά ζεύγους μονάδων δίσκου |
10 |
Κάνει μεγάλη ανάγνωση (512 συν 4 επιπλέον byte ανά τομέα) |
11 |
Κάνει μεγάλη εγγραφή (512 συν 4 επιπλέον byte ανά τομέα) |
12 |
Ψάχνει δίσκος |
13 |
Εναλλακτική επαναφορά δίσκου |
14 |
Διαβάζει το buffer τομέα |
15 |
Γράφει το buffer τομέα |
16 |
Ελέγχει εάν η μονάδα με το όνομα είναι έτοιμη |
17 |
Επαναβαθμονομεί τη μονάδα δίσκου |
18 |
Διαγνωστικός ελεγκτής RAM |
19 |
Διαγνωστικό Drive |
20 |
Εσωτερικό διαγνωστικό ελεγκτή |
diskinfo_t Δομή
Η δομή diskinfo_t χρησιμοποιείται από τη συνάρτηση _bios_disk. Η περιγραφή της δομής έχει ως εξής:
struct diskinfo_t {
ανυπόγραφη μονάδα δίσκου, κεφαλή, τροχιά, τομέας, nsectors.
void far *buffer;
};
Where drive καθορίζει τη μονάδα δίσκου που πρόκειται να χρησιμοποιηθεί. Να θυμάστε πάντα ότι για τους σκληρούς δίσκους καθορίζεται η φυσική μονάδα δίσκου και όχι το διαμέρισμα του δίσκου. Εάν θέλετε να χειριστείτε κατατμήσεις, το πρόγραμμα εφαρμογής πρέπει επίσης να ερμηνεύσει τις πληροφορίες του πίνακα κατατμήσεων αυτού του ίδιου του δίσκου.
Η τιμή της κεφαλής, της τροχιάς και του τομέα καθορίζει τη θέση του αρχικού τομέα για τη λειτουργία. Το nsectors καθορίζει τον αριθμό των τομέων που θα διαβαστούν ή θα γραφτούν και το buffer σημεία στην προσωρινή μνήμη όπου γίνεται ανάγνωση και εγγραφή δεδομένων. Ανάλογα με την τιμή του cmd, οι άλλες παράμετροι στη δομή diskinfo_t μπορεί να χρειάζονται ή να μην χρειάζονται.
Η τιμή για τις προδιαγραφές της μονάδας δίσκου που θα χρησιμοποιηθεί στις συναρτήσεις biosdisk και _bios_disk έχει δοθεί στον ακόλουθο πίνακα:
Αξία μονάδας δίσκου |
Μονάδα δίσκου προς χρήση |
0 |
Πρώτη μονάδα δισκέτας |
1 |
Δεύτερη μονάδα δισκέτας |
2 |
Τρίτη μονάδα δισκέτας |
.... |
(και ούτω καθεξής) |
0x80 |
Πρώτη μονάδα σκληρού δίσκου |
0x81 |
Δεύτερη μονάδα σκληρού δίσκου |
0x82 |
Τρίτη μονάδα σκληρού δίσκου |
.... |
(και ούτω καθεξής) |
Φτάνει η θεωρία! Ας δούμε τώρα μερικά πρακτικά πράγματα και μερικά παραδείγματα αυτών των λειτουργιών. Το ακόλουθο παράδειγμα διαβάζει τους τομείς και στις δύο πλευρές των τεσσάρων κομματιών της δισκέτας και αποθηκεύει τα περιεχόμενα στο αρχείο, που έχει καθορίσει ο χρήστης. Δεν πειράζει, αν έχετε διαγράψει τα αρχεία από το δίσκο σας επειδή το πρόγραμμα διαβάζει απευθείας την επιφάνεια του δίσκου.
Για να δείτε τα διαγραμμένα δεδομένα, είναι καλύτερο να πάρετε μια πλήρως διαμορφωμένη δισκέτα και να αντιγράψετε ορισμένα αρχεία κειμένου, όπως κωδικοποίηση προγραμμάτων .c ή άλλα αρχεία κειμένου (ώστε να μπορείτε να κατανοήσετε τα περιεχόμενα των αρχείων) που καταλαμβάνουν περίπου 73 KB (δεδομένα αποθηκευμένα σε τέσσερα κομμάτια, δύο όψεις και 18 τομείς σε κάθε κομμάτι. Κάθε τομέας είναι 12 bytes ). Το πρόγραμμα έχει αναπτυχθεί για να επιδείξει το παράδειγμα. Ωστόσο, μπορείτε να το αλλάξετε και να το αναπτύξετε σε δεδομένα έτοιμα για ανάκτηση.
/* Πρόγραμμα ανάγνωσης 4 κομματιών (0, 1, 2 και 3) μιας δισκέτας και εγγραφή των περιεχομένων σε καθορισμένο αρχείο */
#include <bios.h>
#include <stdio.h>
#include<conio.h>
κενό κύριο (κενό)
{
int head,track?
int αποτέλεσμα,i,τομέας;
όνομα αρχείου char[80];
char *buffer;
struct diskinfo_t dinfo;
στατικό char dbuf[512];
ΑΡΧΕΙΟ *tt;
clrscr();
/// Ελέγξτε εάν η μονάδα δίσκου είναι έτοιμη ή όχι \\\
if(!(biosdisk(4,0,0,0,0,1, buffer) & 0x02))
{
printf(" Drive A: Not Ready:\n Εισαγωγή δίσκου στη μονάδα A:
και πατήστε οποιοδήποτε πλήκτρο\n");
getch();
}
/* Λήψη του ονόματος αρχείου για την αποθήκευση των δεδομένων των Τομέων του δίσκου */
printf("\nΕισαγάγετε το όνομα του αρχείου προορισμού με πλήρη διαδρομή
για να αποθηκεύσετε τα δεδομένα \n\n >");
gets(όνομα αρχείου);
if((tt= fopen(όνομα αρχείου, "wb"))==NULL)
{
printf("Δεν ήταν δυνατό το άνοιγμα του αρχείου!!!");
getch();
}
for(track=0;track<4;track++)
{
για(κεφάλι=0; κεφάλι<=1;κεφάλι++)
{
για(τομέας=1;τομέας<=18;τομέας++)
{
dinfo.drive = 0; /* αριθμός μονάδας δίσκου για A: */
dinfo.head = κεφάλι; /* αριθμός κεφαλής δίσκου */
dinfo.track = κομμάτι; /* αριθμός κομματιού */
dinfo.sector = τομέας; /* αριθμός τομέα */
dinfo.nsectors = 1; /* καταμέτρηση τομέα */
dinfo.buffer = dbuf; /* buffer δεδομένων */
/// Εμφάνιση της κατάστασης \\\
gotoxy (10,10); printf("Ανάγνωση δεδομένων από: Head=%d
Track=%d Τομέας=%d",
κεφάλι, πίστα, τομέας).
fprintf(tt,"\n Δεδομένα που διαβάζονται από: Head=%d Track=%d Sector=%d\n",
κεφάλι, πίστα, τομέας).
/// Διαβάστε τους καθορισμένους τομείς \\\
αποτέλεσμα = _bios_disk(_DISK_READ, &dinfo);
/// Αποθηκεύστε τα περιεχόμενα στο Καθορισμένο αρχείο \\\
αν ((αποτέλεσμα & 0xff00) == 0)
{
for(i=0;i<512;i++)
fprintf(tt,"%c", dbuf[i] & 0xff);
}
/* Εκτύπωση μηνύματος σφάλματος στην οθόνη και στο αρχείο για Σφάλμα κατά την ανάγνωση ενός τομέα */
αλλού
{
printf("\n Δεν είναι δυνατή η ανάγνωση στο Head= %d Track= %d
Sector= %d\n",head,track,sector);
fprintf(tt,"\n Δεν είναι δυνατή η ανάγνωση στο Head= %d Track= %d
Τομέας =%d\n",head,track,sector);
}
}
}
}
fclose(tt);
}
Το παράδειγμα δείχνει τη χρήση των συναρτήσεων, biosdisk και _bios_disk. Η λειτουργία biosdisk ελέγχει εάν ο δίσκος είναι έτοιμος ή όχι και βρέθηκε το σημάδι διεύθυνσης. Η συνάρτηση _bios_disk διαβάζει τους τομείς και των δύο πλευρών έως και τέσσερα κομμάτια.
Η σειρά ανάγνωσης (ή εγγραφής) στην επιφάνεια του δίσκου πρέπει να είναι η εξής:
Λειτουργίες absread και abswrite
Αυτές οι Λειτουργίες έχουν οριστεί στο Dos.h. Η συνάρτηση absread διαβάζει απόλυτους τομείς δίσκου και η συνάρτηση abswrite γράφει απόλυτους τομείς δίσκου. Η συνάρτηση absread χρησιμοποιεί διακοπή DOS 0x25 για την ανάγνωση συγκεκριμένων τομέων δίσκου και η συνάρτηση abswrite χρησιμοποιεί διακοπή DOS 0x26 για την εγγραφή συγκεκριμένων τομέων δίσκου.
Οι απόλυτες λειτουργίες ανάγνωσης ή εγγραφής προχωρούν με διαδοχικό τρόπο αυξάνοντας τους τομείς βήμα προς βήμα και είναι εντελώς απαλλαγμένοι από αριθμούς κεφαλής και κομματιού κ.λπ. Είναι δουλειά του BIOS του υπολογιστή να μεταφράζει τους απόλυτους τομείς στο αντίστοιχο κομμάτι, αριθμούς Head και Sector.
Συνιστώνται απόλυτες λειτουργίες ανάγνωσης και εγγραφής σε τέτοια προγράμματα όπου πρόκειται να εκτελέσουμε λειτουργία ανάγνωσης/εγγραφής σε ολόκληρο το δίσκο και θέλουμε να αποφύγουμε επιπλέον κωδικοποίηση και βρόχο στο πρόγραμμά μας για να αυξήσουμε την ταχύτητα του προγράμματος στο ταχύτερο.
Και οι δύο λειτουργίες absread και abswrite, αγνοούν τη λογική δομή ενός δίσκου και δεν δίνουν σημασία σε αρχεία, FAT ή καταλόγους. Αυτές οι συναρτήσεις εκτελούν απευθείας λειτουργία απόλυτης ανάγνωσης και απόλυτης εγγραφής στην επιφάνεια του δίσκου. Αυτός είναι ο λόγος που εάν χρησιμοποιηθούν ακατάλληλα, το abswrite μπορεί να αντικαταστήσει αρχεία, καταλόγους και FAT.
Η δήλωση της συνάρτησης absread είναι η εξής:
int absread(int drive, int nsects, long lsect,
void *buffer);
και η συνάρτηση abswrite δηλώνεται ως εξής:
int abswrite(int drive, int nsects, long lsect,
void *buffer);
Όπου η σημασία των παραμέτρων είναι η εξής:
Param. |
Τι Είναι/Κάνει |
οδηγώ |
Αριθμός μονάδας για ανάγνωση (ή εγγραφή): 0 = A, 1 = B, κ.λπ. |
έντομα |
Αριθμός τομέων προς ανάγνωση (ή εγγραφή) |
lsect |
Αρχικός λογικός αριθμός τομέα |
ρυθμιστής |
Διεύθυνση μνήμης όπου πρόκειται να διαβαστούν (ή να εγγραφούν τα δεδομένα) |
Σε περίπτωση επιτυχίας, και οι δύο συναρτήσεις επιστρέφουν 0. Όταν υπάρχει κάποιο σφάλμα, επιστρέφουν και οι δύο -1 και ορίζουν το σφάλμα αρ. στην τιμή του καταχωρητή AX που επιστρέφεται από την κλήση συστήματος.
Ο αριθμός των τομέων για λειτουργία ανάγνωσης ή εγγραφής περιορίζεται στα 64K ή στο μέγεθος του buffer, όποιο είναι μικρότερο. Ωστόσο, θα μάθουμε τη χρήση της τεράστιας μνήμης στα επόμενα κεφάλαια για να ξεπεράσουμε το όριο μνήμης τα 64K, για να αναπτύξουμε ένα πολύ γρήγορο πρόγραμμα.
|
Διακοπή χειρισμού με C
Η C ονομάζεται μερικές φορές μια γλώσσα συναρμολόγησης υψηλού επιπέδου επειδή μπορεί να καλέσει τις διαφορετικές διακοπές χρησιμοποιώντας ορισμένες από τις ορισμένες καθορισμένες συναρτήσεις της. Μερικές σημαντικές λειτουργίες είναι οι εξής:
- int86: Καλεί διακοπές MS-DOS.
- int86x: Καλεί τη διακοπή MS-DOS με τιμές καταχωρητή τμημάτων.
- intdos: καλεί την υπηρεσία MS-DOS χρησιμοποιώντας καταχωρητές εκτός των DX και AL
- intdosx: καλεί την υπηρεσία MS-DOS με τιμές καταχωρητή τμημάτων.
- segread: Διαβάζει καταχωρητές τμημάτων
Θα συζητήσουμε λεπτομερώς αυτές τις λειτουργίες. Πρώτα απ 'όλα συζητάμε μερικές προκαθορισμένες δομές και ενώσεις που χρησιμοποιούνται συχνά ή απαραίτητα με αυτές τις συναρτήσεις.
Δομή SREGS
Αυτή η δομή έχει οριστεί στο dos.h και είναι μια δομή των καταχωρητών τμημάτων που μεταβιβάζονται και συμπληρώνονται από τις συναρτήσεις, int86x, intdosx και segread. Η δήλωση της δομής έχει ως εξής:
struct SREGS {
ανυπόγραφο int es?
ανυπόγραφο int cs?
ανυπόγραφο int ss?
ανυπόγραφο int ds?
};
ένωση REGS
Το REGS είναι η ένωση δύο δομών. Η ένωση REGS έχει οριστεί dos.h και χρησιμοποιείται για τη μετάδοση πληροφοριών προς και από τις συναρτήσεις int86, int86x, intdos και intdosx. Η δήλωση του σωματείου έχει ως εξής:
ένωση REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
Δομές BYTEREGS και WORDREGS
Οι δομές BYTEREGES και WORDREGS έχουν οριστεί σε dos.h και χρησιμοποιούνται για την αποθήκευση καταχωρητών byte και λέξεων. Η δομή WORGREGS επιτρέπει στο χρήστη να έχει πρόσβαση στους καταχωρητές της CPU ως ποσότητες 16-bit όπου η δομή BYTEREGES δίνει την πρόσβαση στους μεμονωμένους καταχωρητές 8-bit.
Η δομή BITEREGS δηλώνεται ως εξής:
struct BYTEREGS {
ανυπόγραφο char al, ah, bl, bh;
ανυπόγραφο char cl, ch, dl, dh;
};
Και η δομή WORDREGS δηλώνεται ως εξής:
struct WORDREGS {
ανυπόγραφο int ax, bx, cx, dx;
ανυπόγραφο int yes, of, cflag, flags?
};
συναρτήσεις int86 και int86x
Αυτές οι λειτουργίες είναι οι γενικές διεπαφές διακοπής λογισμικού 8086 που ορίζονται στο dos.h. Οι καταχωρητές ρυθμίζονται στις επιθυμητές τιμές και αυτές οι συναρτήσεις καλούνται για να καλέσουν τις διακοπές MS-DOS. Η δήλωση της συνάρτησης int86 είναι η εξής:
int int86(int intno, ένωση REGS *inregs,
ένωση REGS *outregs);
Το int86x είναι η παραλλαγή της συνάρτησης int86. Δηλώνεται ως εξής:
int int86x(int intno, ένωση REGS *inregs,
ένωση REGS *υπερβαίνει, struct SREGS *segregs);
Και οι δύο συναρτήσεις int86 και int86x εκτελούν μια διακοπή λογισμικού 8086 που καθορίζεται από το όρισμα intno Ή μπορούμε να πούμε ότι η διακοπή για δημιουργία καθορίζεται από την intno.
Με τη συνάρτηση int86x η πρόσβαση είναι δυνατή μόνο σε ES και DS και όχι σε CS και SS, ώστε να μπορείτε να καλέσετε μια διακοπή λογισμικού 8086 που παίρνει μια τιμή DS διαφορετική από το προεπιλεγμένο τμήμα δεδομένων και/ή λαμβάνει ένα όρισμα στο ES.
Αυτές οι λειτουργίες αντιγράφουν τις τιμές καταχωρητή από τα inreg στους καταχωρητές πριν από την εκτέλεση της διακοπής του λογισμικού. Η συνάρτηση int86x αντιγράφει επίσης τις τιμές segregs->ds και segregs->es στους αντίστοιχους καταχωρητές πριν από την εκτέλεση της διακοπής λογισμικού. Αυτή η δυνατότητα επιτρέπει σε προγράμματα που χρησιμοποιούν μακρινούς δείκτες ή ένα μοντέλο μεγάλης μνήμης δεδομένων να καθορίσουν ποιο τμήμα θα χρησιμοποιηθεί για τη διακοπή λογισμικού.
Οι συναρτήσεις αντιγράφουν τις τρέχουσες τιμές καταχωρητή σε outregs, την κατάσταση της σημαίας μεταφοράς στο πεδίο x.cflag σε outregs και την τιμή των 8086 flags καταχωρούνται στο πεδίο x.flags σε outregs, μετά την επιστροφή της διακοπής λογισμικού. Η συνάρτηση int86x επαναφέρει επίσης το DS και ορίζει τα πεδία segregs->es και segregs->ds στις τιμές των αντίστοιχων καταχωρητών τμημάτων.
Και στις δύο συναρτήσεις τα inreg και τα outregs μπορούν να δείχνουν την ίδια δομή και και οι δύο συναρτήσεις επιστρέφουν την τιμή του AX μετά την ολοκλήρωση της διακοπής λογισμικού. Εάν έχει οριστεί η σημαία μεταφοράς, συνήθως υποδεικνύει ότι έχει προκύψει σφάλμα.
Τα στοιχεία ένωσης REGS που χρησιμοποιούνται στο C, ισοδύναμα με τη γλώσσα Assembly, βρίσκονται στον παρακάτω πίνακα:
16-bit |
8-bit |
Γλώσσα Γ |
Συμβολική γλώσσα |
Γλώσσα Γ |
Συμβολική γλώσσα |
inregs.χ.αξ |
ΤΣΕΚΟΥΡΙ |
inregs.h.al |
AL |
|
|
inregs.h.ah |
AH |
inregs.x.bx |
BX |
inregs.h.bl |
BL |
|
|
inregs.h.bh |
BH |
inregs.x.cx |
CX |
inregs.h.cl |
CL |
|
|
inregs.h.ch |
CH |
inregs.x.dx |
DX |
inregs.h.dl |
DL |
|
|
inregs.h.dh |
DH |
inregs.χ.σι |
ΚΑΙ |
|
|
inregs.x.of |
ΑΠΟ |
|
|
inregs.x.cflag |
CF |
|
|
Ας δούμε τα παραδείγματα των συναρτήσεων int86 και int86x. Το ακόλουθο πρόγραμμα Σαρώνει κάθε τομέα της δισκέτας και εκτυπώνει την κατάσταση κάθε τομέα στην οθόνη.
/* Πρόγραμμα για σάρωση κάθε τομέα της δισκέτας και εκτύπωση της κατάστασης */
#include<dos.h>
#include<conio.h>
void main()
{
int head,track,sector,i;
char *buf;
ένωση REGS inregs, outregs;
struct SREGS sregs.
clrscr();
/// Αρχικοποίηση δίσκου με επαναφορά συστήματος δίσκου \\\
gotoxy (10,2); printf("Εκκίνηση του δίσκου...");
for(i=0;i<3;i++)
{
inregs.h.ah=0x00; // Αριθμός συνάρτησης
inregs.h.dl=0x00; // Δισκέτα
int86(0x13,&inregs,&outregs);
}
gotoxy (10,2); printf("Η κατάσταση του δίσκου είναι ως...\n");
/* Σάρωση της δισκέτας από 0 έως 79 κομμάτια (Σύνολο κομματιών 80) */
for(track=0;track<=79;track++)
for(head=0;head<=1;head++)
για(τομέας=1;τομέας<=18;τομέας++)
{
inregs.h.ah = 0x04; /// συνάρτηση Αριθμός
inregs.h.al = 1; /// Αριθμός τομέων
inregs.h.dl = 0x00; /// Δισκέτα
inregs.h.ch = κομμάτι;
inregs.h.dh = κεφάλι;
inregs.h.cl = τομέας;
inregs.x.bx = FP_OFF(buf);
sregs.es = FP_SEG(buf);
int86x(0x13,&inregs,&outregs,&sregs);
//// Εκτύπωση της κατάστασης του σαρωμένου τομέα \\\\
switch(outregs.h.ah)
{
περίπτωση 0x00:
cprintf("STATUS: Χωρίς Σφάλμα !!");
διακοπή;
περίπτωση 0x01:
cprintf("STATUS: Κακή εντολή ");
διακοπή;
περίπτωση 0x02:
cprintf("STATUS: Το σήμα διεύθυνσης δεν βρέθηκε ");
διακοπή;
περίπτωση 0x03:
cprintf("STATUS: Προσπάθεια εγγραφής σε
δίσκος με προστασία εγγραφής ");
διακοπή;
περίπτωση 0x04:
cprintf("STATUS: Ο τομέας δεν βρέθηκε ");
διακοπή;
περίπτωση 0x05:
cprintf("STATUS: Η επαναφορά απέτυχε (σκληρός δίσκος) ");
διακοπή;
περίπτωση 0x06:
cprintf("STATUS: Ο δίσκος άλλαξε από τελευταία
λειτουργία ");
διακοπή;
περίπτωση 0x07:
cprintf("STATUS: Drive δραστηριότητας παραμέτρων
απέτυχε") ;
διακοπή;
περίπτωση 0x08:
cprintf("STATUS: Άμεση πρόσβαση στη μνήμη (DMA)
υπέρβαση ");
διακοπή;
περίπτωση 0x09:
cprintf("STATUS: Προσπάθεια εκτέλεσης DMA κατά μήκος
64K όριο ");
διακοπή;
περίπτωση 0x0A:
cprintf("STATUS: Εντοπίστηκε κακός τομέας ");
διακοπή;
περίπτωση 0x0B:
cprintf("STATUS: Εντοπίστηκε κακό κομμάτι ");
διακοπή;
θήκη 0x0C:
cprintf("STATUS: Ο τύπος μέσου δεν βρέθηκε ");
διακοπή;
περίπτωση 0x0D:
cprintf("STATUS: Μη έγκυρος αριθμός τομέων ενεργοποιημένος
μορφή (σκληρός δίσκος) ");
διακοπή;
περίπτωση 0x0E:
cprintf("STATUS: Έλεγχος της ένδειξης διεύθυνσης δεδομένων
εντοπίστηκε (σκληρός δίσκος) ");
διακοπή;
θήκη 0x0F:
cprintf("STATUS: Επίπεδο διαιτησίας DMA εκτός
εύρος (σκληρός δίσκος) ");
διακοπή;
θήκη 0x10:
cprintf("ΚΑΤΑΣΤΑΣΗ: Κακή ανάγνωση CRC/ECC στο δίσκο ");
διακοπή;
θήκη 0x11:
cprintf("STATUS: CRC/ECC διορθωμένο σφάλμα δεδομένων ");
διακοπή;
θήκη 0x20:
cprintf("STATUS: Ο ελεγκτής απέτυχε ");
διακοπή;
θήκη 0x31:
cprintf("ΚΑΤΑΣΤΑΣΗ: Δεν υπάρχουν μέσα στη μονάδα δίσκου (IBM/MS INT 13H
επεκτάσεις) ");
διακοπή;
θήκη 0x32:
cprintf("STATUS: Εσφαλμένος τύπος μονάδας δίσκου αποθηκευμένος σε
CMOS (Compaq) ");
διακοπή;
θήκη 0x40:
cprintf("STATUS: Η λειτουργία αναζήτησης απέτυχε ");
διακοπή;
θήκη 0x80:
cprintf("STATUS: Το συνημμένο απέτυχε να ανταποκριθεί
(Λήξη χρόνου δίσκου) ");
διακοπή;
περίπτωση 0xAA:
cprintf("STATUS: Ο δίσκος δεν είναι έτοιμος (σκληρός δίσκος
μόνο) ");
διακοπή;
θήκη 0xB0:
cprintf("STATUS: Ο τόμος δεν είναι κλειδωμένος στη μονάδα δίσκου (INT
13H επεκτάσεις) ");
διακοπή;
θήκη 0xB1:
cprintf("ΚΑΤΑΣΤΑΣΗ: Ο τόμος κλειδωμένος στη μονάδα δίσκου (επεκτάσεις INT 13H) ");
διακοπή;
θήκη 0xB2:
cprintf("STATUS: Ο τόμος δεν αφαιρείται (INT 13H
επεκτάσεις) ");
διακοπή;
θήκη 0xB3:
cprintf("STATUS: Volume in use (INT 13H
επεκτάσεις) ");
διακοπή;
θήκη 0xB4:
cprintf("STATUS: Υπέρβαση του αριθμού κλειδώματος (INT 13H
επεκτάσεις) ");
διακοπή;
θήκη 0xB5:
cprintf("STATUS: Το έγκυρο αίτημα εξαγωγής απέτυχε (INT
13H επεκτάσεις) ");
διακοπή;
θήκη 0xBB:
cprintf("STATUS: Παρουσιάστηκε απροσδιόριστο σφάλμα (σκληρό
μόνο δίσκος) ");
διακοπή;
θήκη 0xCC:
cprintf("STATUS: Παρουσιάστηκε σφάλμα εγγραφής ");
διακοπή;
θήκη 0xE0:
cprintf("STATUS: Σφάλμα μητρώου κατάστασης ");
διακοπή;
θήκη 0xFF:
cprintf("STATUS: Η λειτουργία Sense απέτυχε ");
διακοπή;
προεπιλογή: cprintf("ΚΑΤΑΣΤΑΣΗ: ΑΓΝΩΣΤΟΣ ΚΩΔΙΚΟΣ Κατάστασης ");
}
printf("\nΤρέχουσα θέση= Κομμάτι:%d Επικεφαλίδα:%d Τομέας:%d \n",
πίστα, κεφάλι, τομέας)
}
gotoxy(10,24);printf("Η σάρωση ολοκληρώθηκε!! Πατήστε οποιοδήποτε πλήκτρο TO
Εξοδος..");
getch();
}
Το πρόγραμμα δείχνει το παράδειγμα χρήσης των συναρτήσεων int86 και int86x. Σε αυτό το Πρόγραμμα, η συνάρτηση int86 προετοιμάζει το δίσκο επαναφέροντας το σύστημα του δίσκου, χρησιμοποιώντας τη συνάρτηση 00H του INT 13H. Η συνάρτηση int86x επαληθεύει κάθε τομέα της δισκέτας (1,44 Mb, 3½ δισκέτα) και από τις δύο πλευρές, έως και 0 έως 79 κομμάτια (συνολικά 80 κομμάτια) χρησιμοποιώντας τη συνάρτηση 04H του INT 13H.
Λειτουργία διαχωρισμού
Αυτή η λειτουργία έχει οριστεί στο dos.h. Αυτή η συνάρτηση διαβάζει τους καταχωρητές τμημάτων. Η δήλωση της συνάρτησης έχει ως εξής:
void segread(struct SREGS *segp);
όπου το segread βάζει τις τρέχουσες τιμές των καταχωρητών τμημάτων στη δομή *segp. Δεν επιστρέφεται τίποτα από τη συνάρτηση και η κλήση προορίζεται για χρήση με intdosx και int86x. ας δούμε ένα παράδειγμα
#include <stdio.h>
#include <dos.h>
void main()
{
struct SREGS segs.
segread(&segs);
printf("Ρυθμίσεις μητρώου τρέχοντος τμήματος\n\n");
printf("CS: %X DS: %X\n", segs.cs, segs.ds);
printf("ES: %X SS: %X\n", segs.es, segs.ss);
getch();
}
Και η έξοδος του προγράμματος θα είναι κάπως έτσι:
Τρέχουσες ρυθμίσεις μητρώου τμημάτων
CS: EED DS: 10BA
ES: 10BA SS: 10BA
Λειτουργίες intdos και intdosx
Αυτές οι λειτουργίες έχουν οριστεί στο dos.h. Αυτές είναι οι γενικές διεπαφές διακοπής DOS. Η συνάρτηση intdos καλεί καταχωρητές υπηρεσίας MS-DOS και στη συνέχεια DX και AL όπου η συνάρτηση intdosx καλεί την υπηρεσία MS-DOS με τιμές καταχωρητή τμημάτων.
Η δήλωση της συνάρτησης intdos είναι η εξής:
int intdos(union REGS *inregs, union REGS *outregs);
και η δήλωση της συνάρτησης intdosx είναι ως εξής:
int intdosx(union REGS *inregs, union REGS *outregs,
struct SREGS *segregs);
Οι συναρτήσεις intdos και intdosx εκτελούν διακοπή DOS 0x21 για να καλέσουν μια καθορισμένη συνάρτηση DOS. Η τιμή του inregs->h.ah καθορίζει τη συνάρτηση DOS που θα κληθεί. Η συνάρτηση intdosx αντιγράφει επίσης τις τιμές segregs ->ds και segregs ->es στους αντίστοιχους καταχωρητές πριν από την κλήση της συνάρτησης DOS και στη συνέχεια επαναφέρει το DS.
Αυτή η δυνατότητα των συναρτήσεων επιτρέπει στα προγράμματα που χρησιμοποιούν μακρινούς δείκτες ή ένα μοντέλο μεγάλης μνήμης δεδομένων να καθορίζουν ποιο τμήμα θα χρησιμοποιηθεί για την εκτέλεση της συνάρτησης. Με τη συνάρτηση intdosx μπορείτε να καλέσετε μια συνάρτηση DOS που παίρνει μια τιμή DS διαφορετική από το προεπιλεγμένο τμήμα δεδομένων και/ή λαμβάνει ένα όρισμα στο ES.
Και οι δύο συναρτήσεις επιστρέφουν την τιμή του AX μετά την ολοκλήρωση της κλήσης της συνάρτησης DOS και εάν έχει οριστεί η σημαία μεταφοράς (outregs -> x.cflag != 0), αυτό σημαίνει ότι παρουσιάστηκε σφάλμα.
Αφού η διακοπή 0x21 επιστρέψει, οι συναρτήσεις αντιγράφουν τις τρέχουσες τιμές καταχωρητή στις εξόδους, την κατάσταση της σημαίας μεταφοράς στο πεδίο x.cflag στις εξόδους και την τιμή του καταχωρητή σημαιών 8086 στο πεδίο x.flags στις εξόδους. Τόσο τα inreg όσο και τα outregs μπορούν να δείχνουν την ίδια δομή. Ας δούμε τα παραδείγματα αυτών των συναρτήσεων.
Το παράδειγμα της χρήσης της συνάρτησης intdos έχει δοθεί παρακάτω. Αυτό το πρόγραμμα λαμβάνει τις επιλεγμένες πληροφορίες σχετικά με τη μονάδα δισκέτας (1,44 Mb, δισκέτα 3½ ιντσών). Αυτό το πρόγραμμα παρέχει τις πληροφορίες εκχώρησης μιας δισκέτας.
/* Οι πληροφορίες εκχώρησης μονάδας λήψης για χρήση δίσκου */
#include <dos.h> /* για intdos() και ένωση REGS */
#include <stdio.h> /* for printf() */
ένωση REGS inregs, outregs;
void main()
{
inregs.h.ah = 0x36; /* αποκτήστε ελεύθερο χώρο στο δίσκο
αριθμός συνάρτησης */
inregs.h.dl = 0x01; /* μονάδα δίσκου A: */
intdos(&inregs, &outregs);
printf("%d τομείς/σύμπλεγμα,\n%d συμπλέγματα,\n%d byte/τομέας,
\n%d συνολικά συμπλέγματα",
outregs.x.ax, outregs.x.bx,
outregs.x.cx, outregs.x.dx);
getch();
}
Και η έξοδος του προγράμματος θα είναι η εξής:
1 τομέας/συστάδα,
1933 συστάδες,
512 byte/τομέας,
2843 συνολικά συστάδες
Ας δούμε τώρα ένα παράδειγμα της συνάρτησης intdosx . Το ακόλουθο παράδειγμα δείχνει τη χρήση της συνάρτησης intdosx . Το πρόγραμμα εξάγει μια συμβολοσειρά στην τυπική έξοδο.
/* Το πρόγραμμα για την έξοδο «string» στην τυπική έξοδο. */
#include <dos.h>
union REGS inregs, outregs;
struct SREGS segregs?
char far *string = "αυτή η συμβολοσειρά δεν βρίσκεται στο
προεπιλεγμένο τμήμα δεδομένων$";
void main()
{
inregs.h.ah = 0x09; /* αριθμός συνάρτησης */
inregs.x.dx = FP_OFF(string);/*DS:DX είναι μακριά
διεύθυνση του 'string */
segregs.ds = FP_SEG(string);
intdosx(&inregs, &outregs, &segregs);
getch();
}
Και η έξοδος του προγράμματος θα είναι η εξής:
αυτή η συμβολοσειρά δεν βρίσκεται στο προεπιλεγμένο τμήμα δεδομένων |
Εδώ εκτυπώνουμε τη δεδομένη συμβολοσειρά με τη συνάρτηση intdosx, από τη συνάρτηση 09H του INT 21H. Θα πρέπει πάντα να λαμβάνεται υπόψη ότι η δεδομένη συμβολοσειρά πρέπει πάντα να τελειώνει με τον χαρακτήρα "$".
Πώς να μάθετε τον αριθμό του φυσικού σκληρού δίσκου
Ο αριθμός του φυσικού σκληρού δίσκου είναι πολύ σημαντικό πράγμα και πρέπει να γράφεται με ακρίβεια. Η παράνομη προδιαγραφή μονάδας δίσκου μπορεί να προκαλέσει σημαντική απώλεια δεδομένων. Πρέπει να είμαστε σίγουροι για τον αριθμό της μονάδας δίσκου κατά την ανάκτηση δεδομένων ή τον προγραμματισμό αντιμετώπισης προβλημάτων δίσκου. Πώς να γνωρίζετε τον αριθμό μονάδας δίσκου οποιουδήποτε δίσκου με διαφορετικές διατάξεις δίσκων μπορεί να εκτιμηθεί από τα παραδείγματα που δίνονται στη συνέχεια.
Σύμφωνα με έναν πιο γενικευμένο μύθο, οι αριθμοί φυσικής μονάδας δίσκων παρέχονται σύμφωνα με την κατάσταση επισύναψης του δίσκου, ωστόσο σε ορισμένες ή ειδικές περιπτώσεις μπορεί να εξαρτάται από τη διαδικασία εκκίνησης του λειτουργικού σας συστήματος ή τις ρυθμίσεις εκκίνησης.
Η πιο γενικευμένη ιδέα για τον αριθμό της φυσικής μονάδας δίσκου που παρέχεται από το BIOS έχει δοθεί εδώ, αλλά ακόμα και τότε πρέπει να επιβεβαιώσετε με τη βοήθεια οποιουδήποτε εργαλείου επεξεργασίας δίσκου ή με τα προγράμματα που δίνονται στα επόμενα κεφάλαια, σχετικά με τη διαμόρφωση του δίσκου. Αφού είστε σίγουροι, θα πρέπει να λάβετε οποιαδήποτε απόφαση σχετικά με την εκτέλεση τέτοιων προγραμμάτων που ενδέχεται να καταστρέψουν ή να βλάψουν τα δεδομένα, εάν χρησιμοποιηθούν παράνομα ή ελλείψει γνώσης.
Γενικά, εάν οι δύο δίσκοι είναι συνδεδεμένοι στο σύστημα, ο ένας είναι κύριος κύριος και ο άλλος δευτερεύων κύριος, η πρώτη προτίμηση θα δοθεί στον κύριο κύριο (και στη συνέχεια στον κύριο υποτελή αν υπάρχει) και στη συνέχεια στον δευτερεύοντα κύριο (και στη συνέχεια στον δευτερεύοντα υποτελή αν είναι διαθέσιμος και ούτω καθεξής) και ο φυσικός αριθμός θα δοθεί σύμφωνα με τις προτιμήσεις τους.
Ας υποθέσουμε ότι το σύστημά σας υποστηρίζει το μέγιστο τέσσερις σκληρούς δίσκους κάθε φορά. Και οι τέσσερις σκληροί δίσκοι μπορούν να συνδεθούν όπως δίνεται στη συνέχεια:
Πρωτοβάθμιος Δάσκαλος |
Πρωτοβάθμιος Σκλάβος |
Δευτεροβάθμιος Δάσκαλος |
Δευτεροβάθμιος Σκλάβος |
Ας εξετάσουμε τώρα ορισμένες περιπτώσεις για τον αριθμό των φυσικών μονάδων δίσκου. Εδώ υποθέτω ότι έχετε συνδέσει τους δίσκους με τις κατάλληλες ρυθμίσεις βραχυκυκλωτήρα, όπως αναφέρεται από τον κατασκευαστή του δίσκου, και με τις κατάλληλες ρυθμίσεις Master–Slave:
- Εάν και οι τέσσερις σκληροί δίσκοι είναι συνδεδεμένοι στο σύστημα: εάν και οι τέσσερις δίσκοι είναι συνδεδεμένοι στο σύστημα, οι αριθμοί της φυσικής μονάδας θα είναι οι εξής:
Πρωτοβάθμια/Δευτεροβάθμια (Master/Slave) |
Κατάσταση |
Αριθμός και περιγραφή φυσικής μονάδας δίσκου |
Πρωτοβάθμιος Δάσκαλος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 80H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Πρώτος σκληρός δίσκος . |
Πρωτοβάθμιος Σκλάβος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 81H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Δεύτερος σκληρός δίσκος . |
Δευτεροβάθμιος Δάσκαλος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 82H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Τρίτος σκληρός δίσκος . |
Δευτεροβάθμιος Σκλάβος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας δίσκου θα είναι 83 H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Τέταρτος σκληρός δίσκος . |
- Εάν είναι συνδεδεμένοι τρεις Σκληροί Δίσκοι στο σύστημα: εάν τρεις Σκληροί Δίσκοι είναι συνδεδεμένοι στο σύστημα, οι αριθμοί της φυσικής μονάδας θα είναι σύμφωνα με τις προτιμήσεις συνημμένων. Τα ακόλουθα παραδείγματα αντιπροσωπεύουν ορισμένες από τις ρυθμίσεις:
Πρωτοβάθμια/Δευτεροβάθμια (Master/Slave) |
Κατάσταση |
Αριθμός και περιγραφή φυσικής μονάδας δίσκου |
Πρωτοβάθμιος Δάσκαλος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 80H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Πρώτος σκληρός δίσκος . |
Πρωτοβάθμιος Σκλάβος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 81H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Δεύτερος σκληρός δίσκος . |
Δευτεροβάθμιος Δάσκαλος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 82H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Τρίτος σκληρός δίσκος . |
Δευτεροβάθμιος Σκλάβος |
Ο δίσκος δεν είναι παρών |
-------------------- |
Πρωτοβάθμια/Δευτεροβάθμια (Master/Slave) |
Κατάσταση |
Αριθμός και περιγραφή φυσικής μονάδας δίσκου |
Πρωτοβάθμιος Δάσκαλος |
Ο δίσκος δεν είναι παρών |
-------------------- |
Πρωτοβάθμιος Σκλάβος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 80H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Πρώτος σκληρός δίσκος . |
Δευτεροβάθμιος Δάσκαλος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 81H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Δεύτερος σκληρός δίσκος . |
Δευτεροβάθμιος Σκλάβος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 82H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Τρίτος σκληρός δίσκος . |
Πρωτοβάθμια/Δευτεροβάθμια (Master/Slave) |
Κατάσταση |
Αριθμός και περιγραφή φυσικής μονάδας δίσκου |
Πρωτοβάθμιος Δάσκαλος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 80H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Πρώτος σκληρός δίσκος . |
Πρωτοβάθμιος Σκλάβος |
Ο δίσκος δεν είναι παρών |
-------------------- |
Δευτεροβάθμιος Δάσκαλος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 81H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Δεύτερος σκληρός δίσκος . |
Δευτεροβάθμιος Σκλάβος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 82H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Τρίτος σκληρός δίσκος . |
Πρωτοβάθμια/Δευτεροβάθμια (Master/Slave) |
Κατάσταση |
Αριθμός και περιγραφή φυσικής μονάδας δίσκου |
Πρωτοβάθμιος Δάσκαλος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 80H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Πρώτος σκληρός δίσκος . |
Πρωτοβάθμιος Σκλάβος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 81H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Δεύτερος σκληρός δίσκος . |
Δευτεροβάθμιος Δάσκαλος |
Ο δίσκος δεν είναι παρών |
-------------------- |
Δευτεροβάθμιος Σκλάβος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 82H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Τρίτος σκληρός δίσκος . |
- Εάν δύο σκληροί δίσκοι είναι συνδεδεμένοι στο σύστημα: Ομοίως, εάν δύο σκληροί δίσκοι είναι συνδεδεμένοι στο σύστημα, οι αριθμοί της φυσικής μονάδας θα είναι σύμφωνα με τις προτιμήσεις συνημμένων. Το παρακάτω παράδειγμα το δείχνει:
Πρωτοβάθμια/Δευτεροβάθμια (Master/Slave) |
Κατάσταση |
Αριθμός και περιγραφή φυσικής μονάδας δίσκου |
Πρωτοβάθμιος Δάσκαλος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 80H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Πρώτος σκληρός δίσκος . |
Πρωτοβάθμιος Σκλάβος |
Ο δίσκος δεν είναι παρών |
-------------------- |
Δευτεροβάθμιος Δάσκαλος |
Ο δίσκος δεν είναι παρών |
-------------------- |
Δευτεροβάθμιος Σκλάβος |
Ο δίσκος είναι παρών |
Ο αριθμός φυσικής μονάδας θα είναι 81H. Σε αυτή την περίπτωση ο σκληρός δίσκος ονομάζεται Δεύτερος σκληρός δίσκος . |
- Εάν ένας μοναδικός σκληρός δίσκος είναι συνδεδεμένος στο σύστημα: Δεν χρειάζεται να σκεφτείτε, εάν υπάρχει μόνο ένας διαθέσιμος δίσκος, ο αριθμός της φυσικής μονάδας θα είναι 80H.
Διακοπή 13H (INT 13H), Λειτουργίες προγράμματος οδήγησης δίσκου ROM BIOS
Η περιγραφή των λειτουργιών INT 13H έχει δοθεί εδώ. Αυτές οι λειτουργίες πρέπει να μαθαίνονται με προσοχή, καθώς η κακή χρήση αυτών των λειτουργιών ή η χρήση με έλλειψη προσοχής ή έλλειψη γνώσης, μπορεί να προκαλέσει μεγάλη απώλεια δεδομένων ή πολλά άλλα προβλήματα. Ωστόσο, εάν χρησιμοποιηθούν με τον κατάλληλο και σωστό τρόπο, αυτές οι λειτουργίες βοηθούν στην ελαχιστοποίηση της κωδικοποίησης του προγράμματός σας και στον προγραμματισμό σας απλό και εύκολο.
INT 13H (0x13)
Λειτουργία 00H (0x00) Επαναφορά συστήματος δίσκου
Κλήση με AH = 00H
DL = κίνηση
Δισκέτα 00H-7FH
Σταθερός δίσκος 80H-FFH
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00H
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Επαναφέρετε τον ελεγκτή δίσκου, βαθμονομεί εκ νέου τις συνδεδεμένες μονάδες δίσκου. Ο βραχίονας ανάγνωσης/εγγραφής μετακινείται στον κύλινδρο 0 και προετοιμάζεται για την είσοδο/έξοδο του δίσκου.
Αυτή η συνάρτηση θα πρέπει να κληθεί μετά από αποτυχία αίτησης για ανάγνωση, εγγραφή, επαλήθευση ή μορφοποίηση δισκέτας πριν από την επανάληψη της λειτουργίας. Εάν η συνάρτηση καλείται με μια μονάδα σταθερού δίσκου (δηλαδή επιλέγοντας DL>=80H), ο ελεγκτής δισκέτας και μετά ο ελεγκτής σταθερού δίσκου επαναφέρονται.
INT 13H (0x13)
Λειτουργία 01H (0x01) Λήψη κατάστασης συστήματος δίσκου
Κλήση με: AH = 01H
DL = δίσκος
Δισκέτα 00H-7FH
Σταθερός δίσκος 80H-FFH
Επιστροφές: AH = 00H
AL = κατάσταση προηγούμενης λειτουργίας του δίσκου
(Δείτε τον πίνακα που δόθηκε πριν για σφάλματα
και περιγραφή κωδικών κατάστασης).
Σχόλια:
Επιστρέφει την κατάσταση της πιο πρόσφατης λειτουργίας δίσκου
INT 13H (0x13)
Συνάρτηση 02H (0x02) Ανάγνωση τομέα
Κλήση με: AH = 02H
AL = αριθμός τομέων
CH = κύλινδρος
CL = τομέας
DH = κεφάλι
DL = δίσκος
Δισκέτα 00H-7FH
Σταθερός δίσκος 80H-FFH
ES:BX = τμήμα: μετατόπιση buffer
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00H
AL = αριθμός τομέων που μεταφέρθηκαν
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η συνάρτηση διαβάζει έναν ή περισσότερους τομείς από το δίσκο στη μνήμη. Σε σταθερούς δίσκους, τα επάνω 2 bit του αριθμού κυλίνδρου των 10 bit τοποθετούνται στα επάνω 2 bit του καταχωρητή CL.
INT 13H (0x13)
Συνάρτηση 03H (0x03) Τομέας εγγραφής
Κλήση με: AH = 03H
AL = αριθμός τομέων
CH = κύλινδρος
CL = τομέας
DH = κεφάλι
DL = δίσκος
Δισκέτα 00H-7FH
Σταθερός δίσκος 80H-FFH
ES: BX = τμήμα: μετατόπιση buffer
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00H
AL = αριθμός μεταφερόμενου τομέα
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η συνάρτηση γράφει έναν ή περισσότερους τομείς από τη μνήμη στο δίσκο. Σε σταθερούς δίσκους, τα επάνω 2 bit του αριθμού κυλίνδρου των 10 bit τοποθετούνται στα επάνω 2 bit του καταχωρητή CL.
INT 13H (0x13)
Λειτουργία 04H (0x04) >> Επαλήθευση τομέα
Κλήση με: AH = 04H
AL = αριθμός τομέων
CH = κύλινδρος
CL = τομέας
DH = κίνηση
Δισκέτα 00H-7FH
Σταθερή μονάδα δίσκου 80H-FFH
ES: BX = τμήμα: μετατόπιση buffer
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00H
AL = αριθμός τομέων που επαληθεύτηκαν
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η συνάρτηση επαληθεύει τα πεδία διευθύνσεων ενός ή περισσότερων τομέων. Δεν μεταφέρονται δεδομένα από ή προς τη μνήμη με αυτήν τη λειτουργία. Σε σταθερούς δίσκους, τα επάνω 2 bit του αριθμού κυλίνδρου των 10 bit τοποθετούνται στα επάνω 2 bit του καταχωρητή CL.
Αυτή η λειτουργία μπορεί να χρησιμοποιηθεί για να ελέγξει εάν ένα αναγνώσιμο μέσο βρίσκεται σε μονάδα δισκέτας. Το πρόγραμμα που ζητά θα πρέπει να επαναφέρει το σύστημα δισκέτας (INT 13H Function 00H) και να δοκιμάσει ξανά τη λειτουργία τρεις φορές πριν υποθέσει ότι δεν υπάρχει αναγνώσιμη δισκέτα. Συνιστάται στις περισσότερες από τις λειτουργίες προετοιμασίας δισκέτας.
INT 13H (0x13)
Λειτουργία 05H (0x05) >> Μορφοποίηση κομματιού
Κλήση με: AH = 05H
AL = παρεμβολή (σταθεροί δίσκοι PC/XT)
CH = κύλινδρος
DH = κεφάλι
DL = δίσκος
Δισκέτα 00H-7FH
Σταθερός δίσκος 80H-FFH
ES: BX = τμήμα: μετατόπιση λίστας πεδίων διευθύνσεων
(Εκτός από σταθερό δίσκο PC/XT)
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00H
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση (δείτε τον πίνακα κατάστασης που δίνεται
πρωτύτερα)
Σχόλια:
Αρχικοποιήστε τον τομέα του δίσκου και τα πεδία διεύθυνσης κομματιών στο καθορισμένο κομμάτι. Στις δισκέτες, η λίστα του πεδίου διευθύνσεων αποτελείται από μια σειρά από καταχωρήσεις 4 byte, μία καταχώρηση ανά τομέα. Η Μορφή έχει δοθεί στον παρακάτω πίνακα.
Σε σταθερούς δίσκους, τα επάνω 2 bit του αριθμού κυλίνδρου των 10 bit τοποθετούνται στα επάνω 2 bit του καταχωρητή CL.
Ψηφιόλεξη |
Περιεχόμενα |
0 |
Κύλινδρος |
1 |
Κεφάλι |
2 |
Τομέας |
3
|
Κωδικός μεγέθους τομέα
Αξία |
Περιγραφή |
00H |
128 Byte ανά τομέα |
01 Ω |
256 Byte ανά τομέα |
02H |
512 Byte ανά τομέα |
03 Ω |
1024 Byte ανά τομέα |
|
INT 13H (0x13)
Λειτουργία 06H (0x06) >> Μορφοποίηση κακού κομματιού
Κλήση με: AH = 06H
AL = παρεμβάλλω
CH = κύλινδρος
DH = κεφάλι
DL = δίσκος
Σταθερός δίσκος 80H-FFH
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00H
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η λειτουργία ορίζεται μόνο για μονάδες σταθερού δίσκου PC/XT. Αρχικοποιεί ένα κομμάτι, γράφοντας πεδία διεύθυνσης δίσκου και τομείς δεδομένων και ορίζοντας σημαίες κακού τομέα.
INT 13H (0x13)
Λειτουργία 07H (0x07) >> Μορφοποίηση μονάδας δίσκου
Κλήση με: AH = 07H
AL = παρεμβάλλω
CH = κύλινδρος
DL = δίσκος
Σταθερός δίσκος 80H-FFH
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00H
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση (δείτε τον πίνακα κατάστασης που δίνεται
πρωτύτερα)
Σχόλια:
Αυτή η λειτουργία ορίζεται μόνο για μονάδες σταθερού δίσκου PC/XT. Μορφοποιεί ολόκληρη τη μονάδα δίσκου, γράφοντας πεδία διεύθυνσης δίσκου και τομείς δεδομένων, ξεκινώντας από τον καθορισμένο κύλινδρο.
INT 13H (0x13)
Λειτουργία 08H (0x08) >> Λήψη παραμέτρων μονάδας δίσκου
Κλήση με: AH = 08H
DL = δίσκος
Δισκέτα 00H-7FH
Σταθερός δίσκος 80H-FFH
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
BL = τύπος μονάδας δίσκου (PC/AT και PS/2 δισκέτα
δίσκος)
Αξία |
Περιγραφή |
01 Ω |
360 KB, 40 κομμάτι, 5,25” |
02H |
1,2 MB, 80 κομμάτι, 5,25” |
03 Ω |
720 KB, 80 κομμάτι, 3,5” |
04Ω |
1,44 MB, 80 κομμάτι, 3,5” |
CH = χαμηλό 8 bit μέγιστου κυλίνδρου
αριθμός
CL = bit 6-7 υψηλής τάξης 2 bit το μέγιστο
μπιτ αριθμού κυλίνδρου 0-5 μέγιστο
αριθμός τομέα
DH = μέγιστος αριθμός κεφαλής
DL = αριθμός μονάδων δίσκου
ES: DI = τμήμα: μετατόπιση μονάδας δίσκου
πίνακα παραμέτρων
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η συνάρτηση επιστρέφει διάφορες παραμέτρους για την καθορισμένη μονάδα δίσκου. Η τιμή που επιστρέφεται στον καταχωρητή DL αντικατοπτρίζει τον πραγματικό αριθμό φυσικών μονάδων δίσκου που είναι συνδεδεμένες στον προσαρμογέα για τη μονάδα δίσκου που ζητήσατε.
INT 13H (0x13)
Λειτουργία 09H (0x09) >> Αρχικοποίηση χαρακτηριστικών σταθερού δίσκου
Κλήση με: AH = 09H
DL = δίσκος
Σταθερός δίσκος 80H-FFH
Στο PC/XT Vector για INT 41H
πρέπει να δείχνει στο μπλοκ παραμέτρων δίσκου ή στο PC/AT και στο PS/2
Το διάνυσμα για το INT 41H πρέπει να δείχνει στο δίσκο
μπλοκ παραμέτρων για τη μονάδα δίσκου 0
Το διάνυσμα για το INT 46H πρέπει να δείχνει στο δίσκο
μπλοκ παραμέτρων για τη μονάδα δίσκου 1
Επιστροφές : Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00H
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η συνάρτηση προετοιμάζει τον ελεγκτή σταθερού δίσκου για επόμενες λειτουργίες I/O, χρησιμοποιώντας τις τιμές που βρίσκονται στο μπλοκ παραμέτρων του δίσκου ROM BIOS. Η λειτουργία υποστηρίζεται μόνο σε σταθερό δίσκο. Η μορφή μπλοκ παραμέτρων για σταθερούς δίσκους PC και PC/XT είναι η εξής:
Αλλαγές |
Περιεχόμενα |
00H-01H |
Μέγιστος αριθμός κυλίνδρων |
02H |
Μέγιστος αριθμός κεφαλών |
03H-04H |
Εκκίνηση κύλινδρο μειωμένου ρεύματος εγγραφής |
05H-06H |
Έναρξη εγγραφής πριν τον κύλινδρο αντιστάθμισης |
07 Ω |
Μέγιστο μήκος ριπής ECC |
08Ω
|
Επιλογή κίνησης
Bit(α) |
Σημασία (αν έχει οριστεί) |
0 – 2 |
επιλογή κίνησης |
3 – 5 |
κράτηση (0) |
6 |
απενεργοποιήστε τις καταχωρήσεις ECC |
7 |
απενεργοποιήστε τις επαναλήψεις πρόσβασης στο δίσκο |
|
09Η |
Τυπική τιμή χρονικού ορίου |
0AH |
Τιμή λήξης χρόνου για μονάδα δίσκου μορφής |
0BH |
Τιμή λήξης χρονικού ορίου για τη μονάδα ελέγχου |
0CH-0FH |
Ρεζερβέ |
Η μορφή μπλοκ παραμέτρων για σταθερούς δίσκους PC/AT και PS/2 είναι η εξής:
Αλλαγές |
Περιεχόμενα |
00H_01H |
μέγιστος αριθμός κυλίνδρων |
02H |
μέγιστος αριθμός κεφαλών |
03H-04H |
Ρεζερβέ |
05H-06H |
κύλινδρος εκκίνησης εγγραφής προ αντιστάθμισης |
07 Ω |
μέγιστο μήκος ριπής ECC |
08Ω |
Επιλογές οδήγησης
Bit(α) |
Σημασία (αν έχει οριστεί) |
0 – 2 |
δεν χρησιμοποιείται |
3 |
περισσότερα από 8 κεφάλια |
4 |
δεν χρησιμοποιείται |
5 |
χάρτης ελαττωμάτων κατασκευαστή που υπάρχει στο
μέγιστο κύλινδρο +1 |
6 – 8 |
μη μηδενικό (10, 01 ή 11) εάν οι επαναλήψεις είναι απενεργοποιημένες |
|
09H-0BH |
Ρεζερβέ |
0CH-0DH |
κύλινδρος ζώνης προσγείωσης |
0EH |
τομέα ανά κομμάτι |
0FH |
Ρεζερβέ |
INT 13H (0x13)
Λειτουργία 0A H (0x0A ή 10) >> Ανάγνωση τομέα
Κλήση με: AH = 0AH
AL = αριθμός τομέων
CH = κύλινδρος
CL = τομέας
DH = κεφάλι
DL = δίσκος
Σταθερός δίσκος 80H-FFH
ES: BX = τμήμα: μετατόπιση buffer
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00H
AL = αριθμός τομέων που μεταφέρθηκαν
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η συνάρτηση διαβάζει έναν τομέα ή τομείς από το δίσκο στη μνήμη μαζί με έναν κωδικό 4 byte Error Correcting Code (ECC) για κάθε τομέα. Σε αντίθεση με την κανονική λειτουργία του τομέα ανάγνωσης (Λειτουργία INT 13H (0x13) 02H), τα σφάλματα ECC δεν διορθώνονται αυτόματα. Οι μεταφορές πολλαπλών τομέων τερματίζονται μετά από οποιονδήποτε τομέα με σφάλμα ανάγνωσης.
Αυτή η λειτουργία υποστηρίζεται μόνο σε σταθερούς δίσκους. Τα επάνω 2 bit του αριθμού κυλίνδρου των 10 bit τοποθετούνται στα επάνω 2 bit του καταχωρητή CL.
INT 13H (0x13)
Συνάρτηση 0BH (0x0B ή 11) >> Καταγραφή τομέα
Κλήση με: AH = 0BH
AL = αριθμός τομέων
CH = κύλινδρος
CL = τομέας
DH = κεφάλι
DL = δίσκος
Σταθερός δίσκος 80H-FFH
ES: BX = τμήμα: μετατόπιση buffer
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00H
AL = αριθμός τομέων που μεταφέρθηκαν
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η συνάρτηση γράφει έναν τομέα(ούς) από τη μνήμη στο δίσκο. Τα δεδομένα αξίας κάθε τομέα πρέπει να ακολουθούνται από τον κωδικό ECC των 4 byte. Τα επάνω 2 bit του αριθμού κυλίνδρου των 10 bit τοποθετούνται στα επάνω 2 bit του καταχωρητή CL. Αυτή η λειτουργία υποστηρίζεται μόνο σε σταθερούς δίσκους.
INT 13H (0x13)
Λειτουργία 0CH (0x0C ή 12) >> Αναζήτηση
Κλήση με: AH = 0CH
CH = κάτω 8 bit κυλίνδρου
CL = άνω 2 bit κυλίνδρου στα bits 6-7
DH = κεφάλι
DL = δίσκος
Σταθερός δίσκος 80H-FFH
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00H
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η λειτουργία τοποθετεί τις κεφαλές ανάγνωσης/εγγραφής δίσκου στον καθορισμένο κύλινδρο χωρίς να μεταφέρει δεδομένα. Τα επάνω 2 bit του αριθμού κυλίνδρου τοποθετούνται στα επάνω 2 bit του καταχωρητή CL. Αυτή η λειτουργία υποστηρίζεται μόνο σε σταθερούς δίσκους.
INT 13H (0x13)
Λειτουργία 0DH (0x0D ή 13) >> Επαναφορά συστήματος σταθερού δίσκου
Κλήση με: AH = 0DH
DL = δίσκος
Σταθερός δίσκος 80H-FFH
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00H
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση (δείτε τη συνάρτηση INT 13H 01H)
Σχόλια:
Αυτή η λειτουργία επαναφέρει τον ελεγκτή σταθερού δίσκου, επαναβαθμονομεί τις προσαρτημένες μονάδες δίσκου, μετακινεί τον βραχίονα ανάγνωσης/εγγραφής στον κύλινδρο 0 και προετοιμάζεται για την επόμενη είσοδο/έξοδο του δίσκου.
INT 13H (0x13)
Λειτουργία 0EH (0x0E ή 14) >> Ανάγνωση του buffer τομέα
Κλήση με: AH = 0EH
ES: BX = τμήμα: μετατόπιση buffer
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η λειτουργία μεταφέρει τα περιεχόμενα της προσωρινής μνήμης εσωτερικού τομέα του προσαρμογέα σταθερού δίσκου στη μνήμη του συστήματος. Δεν διαβάζονται δεδομένα από τη φυσική μονάδα δίσκου.
INT 13H (0x13)
Λειτουργία 0FH (0x0F ή 15) >> Εγγραφή του buffer τομέα
Κλήση με: AH = 0FH
ES: BX = τμήμα: μετατόπιση buffer
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η λειτουργία μεταφέρει δεδομένα από τη μνήμη συστήματος στην προσωρινή μνήμη εσωτερικού τομέα του σταθερού προσαρμογέα. Δεν εγγράφονται δεδομένα στη φυσική μονάδα δίσκου. Αυτή η συνάρτηση θα πρέπει να κληθεί για να αρχικοποιήσει τα περιεχόμενα της προσωρινής μνήμης τομέα πριν μορφοποιήσετε τη μονάδα δίσκου με τη λειτουργία INT 13H 05H.
INT 13H (0x13)
Λειτουργία 10H (0x10 ή 16) >> Λήψη κατάστασης μονάδας δίσκου
Κλήση με: AH = 10H
DL = δίσκος
Σταθερός δίσκος 80H-FFH
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00H
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η λειτουργία ελέγχει εάν η καθορισμένη μονάδα σταθερού δίσκου είναι λειτουργική και επιστρέφει την κατάσταση της μονάδας. Αυτή η λειτουργία υποστηρίζεται μόνο σε σταθερούς δίσκους.
INT 13H (0x13)
Λειτουργία 11H (0x11 ή 17) >> Επαναβαθμονόμηση μονάδας
Κλήση με: AH =11H
DL = δίσκος
Σταθερός δίσκος 80H-FFH
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00H
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η λειτουργία αναγκάζει τον προσαρμογέα σταθερού δίσκου να επαναβαθμονομηθεί για την καθορισμένη μονάδα δίσκου, τοποθετώντας τον βραχίονα ανάγνωσης/εγγραφής στον κύλινδρο 0 και επιστρέφει την κατάσταση της μονάδας. Αυτή η λειτουργία υποστηρίζεται μόνο σε σταθερούς δίσκους.
INT 13H (0x13)
Λειτουργία 12H (0x12 ή 18) >> Διαγνωστικός ελεγκτής RAM
Κλήση με: AH = 12H
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η λειτουργία αναγκάζει τον προσαρμογέα σταθερού δίσκου να πραγματοποιήσει έναν ενσωματωμένο διαγνωστικό έλεγχο στην προσωρινή μνήμη εσωτερικού τομέα του, υποδεικνύοντας εάν η δοκιμή πέρασε από την κατάσταση επιστροφής.
INT 13H (0x13)
Λειτουργία 13H (0x13 ή 19) >> Διαγνωστικός δίσκος ελεγκτή
Κλήση με: AH = 13H
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η λειτουργία αναγκάζει τον σταθερό προσαρμογέα να εκτελέσει εσωτερικές διαγνωστικές δοκιμές της συνδεδεμένης μονάδας δίσκου, υποδεικνύοντας εάν η δοκιμή πέρασε από την κατάσταση επιστροφής.
INT 13H (0x13)
Λειτουργία 14H (0x14 ή 20) >> Εσωτερικός διαγνωστικός ελεγκτής
Κλήση με: AH = 14H
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00H
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η λειτουργία αναγκάζει τον προσαρμογέα σταθερού δίσκου να πραγματοποιήσει έναν ενσωματωμένο διαγνωστικό αυτοέλεγχο, υποδεικνύοντας εάν η δοκιμή πέρασε από την κατάσταση επιστροφής.
INT 13H (0x13)
Λειτουργία 15H (0x15 ή 21) >> Λήψη τύπου δίσκου
Κλήση με: AH = 15H
DL = δίσκος
Δισκέτα 00H-7FH
Σταθερός δίσκος 80H-FFH
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = κωδικός τύπου μονάδας δίσκου
00H εάν δεν υπάρχει μονάδα δίσκου
01H εάν υπάρχει μονάδα δισκέτας χωρίς υποστήριξη γραμμής αλλαγής
02H εάν μονάδα δισκέτας με υποστήριξη γραμμής αλλαγής
03H εάν σταθερή δισκέτα
|
Και, εάν σταθερός δίσκος (AH =03H)
CX: DX = αριθμός τομέων 512 byte
Εάν η λειτουργία είναι ανεπιτυχής
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η συνάρτηση επιστρέφει έναν κωδικό που υποδεικνύει τον τύπο δισκέτας ή σταθερής δισκέτας που αναφέρεται από τον καθορισμένο κωδικό μονάδας δίσκου.
INT 13H (0x13)
Λειτουργία 16H (0x16 ή 22) >> Λήψη κατάστασης αλλαγής δίσκου
Κλήση με: AH = 16H
DL = δίσκος
Δισκέτα 00H-7FH
Επιστρέφει: Εάν η γραμμή αλλαγής είναι ανενεργή και ο δίσκος δεν έχει αλλάξει
Φέρω σημαία = καθαρός
AH = 00H
Εάν η γραμμή αλλαγής είναι ενεργή και ο δίσκος μπορεί να έχει αλλάξει
Φέρω σημαία = σετ
AH = 06H
Σχόλια:
Αυτή η συνάρτηση επιστρέφει την κατάσταση της γραμμής αλλαγής, υποδεικνύοντας εάν ο δίσκος στη μονάδα δίσκου μπορεί να έχει αντικατασταθεί από την τελευταία πρόσβαση στο δίσκο. Εάν αυτή η λειτουργία επιστρέψει με τη σημαία μεταφοράς, ο δίσκος δεν έχει απαραίτητα αλλάξει και η γραμμή αλλαγής μπορεί να ενεργοποιηθεί απλά ξεκλειδώνοντας και κλειδώνοντας τη θύρα της μονάδας δίσκου χωρίς να αφαιρέσετε τη δισκέτα.
INT 13H (0x13)
Λειτουργία 17H (0x17 ή 23) >> Ρύθμιση τύπου δίσκου
Κλήση με: AH = 17H
AL = κωδικός τύπου δισκέτας
Αξία |
Περιγραφή |
00H |
Δεν χρησιμοποιείται |
01 Ω |
Δισκέτα 320/360 KB σε μονάδα δίσκου 360 KB |
02H |
Δισκέτα 320/360 KB σε μονάδα δίσκου 1,2 MB |
03 Ω |
Δισκέτα 1,2 MB σε μονάδα δίσκου 1,2 MB |
04Ω |
Δισκέτα 720 KB σε μονάδα δίσκου 720 KB |
SL = κίνηση
Δισκέτα 00H-7FH
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00X
Εάν η λειτουργία αποτύχει
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η λειτουργία επιλέγει τον τύπο δισκέτας για την καθορισμένη μονάδα δίσκου.
ΕΣΩΤΕΡΙΚΗ 13Ω (0x13)
Λειτουργία 18H (0x18 ή 24) >> Ρύθμιση τύπου μέσου εκτύπωσης για μορφή
Κλήση από: AH = 18H
CH = αριθμός κυλίνδρων
CL = τομέας ανά κομμάτι
DL = δίσκος
Δισκέτα 00H-7FH
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00X
ES : DI = τμήμα : μετατόπιση δίσκου
πίνακα παραμέτρων για τον τύπο μέσου
Εάν η λειτουργία αποτύχει
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η λειτουργία επιλέγει τα χαρακτηριστικά μέσων για την καθορισμένη μονάδα δίσκου, επομένως η μονάδα πρέπει να διαθέτει δισκέτα.
ΕΣΩΤΕΡΙΚΗ 13Ω (0x13)
Λειτουργία 19H (0x19 ή 25) >> Κεφαλές στάθμευσης
Κλήση από: AH = 19H
DL = κίνηση
Σταθερός δίσκος 80H-FFH
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00X
Εάν η λειτουργία αποτύχει
Φέρω σημαία = σετ
AH = κατάσταση
Σχόλια:
Αυτή η λειτουργία μετακινεί το μοχλό ανάγνωσης/εγγραφής σε ένα κομμάτι που δεν χρησιμοποιείται για αποθήκευση δεδομένων, έτσι ώστε τα δεδομένα να μην αλλοιώνονται όταν η μονάδα είναι απενεργοποιημένη.
ΕΣΩΤΕΡΙΚΗ 13Ω (0x13)
Λειτουργία 1AH (0x1A ή 26) >> Μορφοποίηση δίσκου ESDI
Κλήση με: AH = 1AH
AL = Σχετική διεύθυνση αποκλεισμού (RBA)
αριθμός ελαττωμάτων στον πίνακα
0 εάν δεν υπάρχει πίνακας RBA
>0 εάν χρησιμοποιείται πίνακας RBA
CL = bit τροποποιητή μορφής
Σελίδες |
Σημασία (αν έχει οριστεί) |
0 |
Αγνοήστε τον χάρτη του κύριου ελαττώματος |
1 |
Αγνοήστε τον χάρτη δευτερεύοντος ελαττώματος |
2 |
Ενημέρωση χάρτη δευτερευόντων ελαττωμάτων |
3 |
Εκτελέστε προηγμένη ανάλυση επιφάνειας |
4 |
Δημιουργήστε μια περιοδική διακοπή |
5-7 |
Κράτηση (πρέπει να είναι 0) |
DL = κίνηση
Σταθερός δίσκος 80H-FFH
ES:BX = μετατόπιση πίνακα τμήματος:RBA
Επιστρέφει: Εάν η λειτουργία είναι επιτυχής
Φέρω σημαία = καθαρός
AH = 00X
Εάν η λειτουργία αποτύχει
Φέρω σημαία = σετ
AH = κατάσταση (δείτε τη συνάρτηση INT 13H 01H)
Σχόλια:
Αυτή η συνάρτηση προετοιμάζει τον τομέα του δίσκου και τα πεδία διεύθυνσης παρακολούθησης σε έναν δίσκο συνδεδεμένο σε έναν προσαρμογέα σκληρού δίσκου ESDI.
Η λειτουργία αυτής της λειτουργίας ονομάζεται μορφοποίηση χαμηλού επιπέδου και προετοιμάζει το δίσκο για λειτουργίες φυσικής ανάγνωσης/εγγραφής σε επίπεδο τομέα. Στη συνέχεια, ο δίσκος πρέπει να διαμεριστεί χρησιμοποιώντας την εντολή FDISK και στη συνέχεια να μορφοποιηθεί σε υψηλό επίπεδο χρησιμοποιώντας την εντολή FORMAT για να εγκαταστήσετε το σύστημα αρχείων.