Κεφάλαιο – 11
Δημιουργία αντιγράφων ασφαλείας
Γιατί χρειάζεστε αντίγραφα ασφαλείας;
«Η πρόληψη είναι πάντα καλύτερη από τη θεραπεία». Η δημιουργία αντιγράφων ασφαλείας είναι επίσης ένα σημαντικό μέρος της πρόληψης καταστροφής δεδομένων, το οποίο μπορεί να μας βοηθήσει να ξεπεράσουμε την αποτυχία του δίσκου ή οποιοδήποτε άλλο είδος απώλειας δεδομένων. Σε αυτό το κεφάλαιο, θα συζητήσουμε πώς μπορούμε να ανακτήσουμε δεδομένα ακόμα και μετά από κάποιες σοβαρές αποτυχίες του δίσκου, χρησιμοποιώντας μόνο αντίγραφα ασφαλείας που έχουν δημιουργηθεί προηγουμένως.
Η ανάκτηση χρησιμοποιώντας προηγουμένως αποθηκευμένα αντίγραφα ασφαλείας είναι σχεδόν πάντα έως και 100 τοις εκατό, ωστόσο, σε ορισμένες συγκεκριμένες περιπτώσεις, διαφορετικοί τύποι αστοχιών δίσκου μπορεί να προκαλέσουν διαφορές στα αποτελέσματα ανάκτησης.
Η επαναφορά δεδομένων με χρήση αντιγράφων ασφαλείας είναι μια αρκετά απλή, γρήγορη και αξιόπιστη διαδικασία που μπορεί να δώσει τα καλύτερα αποτελέσματα, ενώ η επαναφορά δεδομένων χωρίς αντίγραφα ασφαλείας είναι πολύπλοκη, μπερδεμένη και μπορεί να πάρει πολύ χρόνο, και ακόμη και τότε, σε πολλές περιπτώσεις φοβόμαστε ότι δεν λαμβάνουμε το 100 τοις εκατό των δεδομένων.
Πότε και τι να κάνετε κράτηση
Υπάρχουν πολλές διαφορετικές περιοχές στο δίσκο που πρέπει να αντιγραφούν μία φορά ή σε διαφορετικά διαστήματα. Ο παρακάτω πίνακας παρέχει μια επισκόπηση των βημάτων που συνεπάγεται η πλήρης δημιουργία αντιγράφων ασφαλείας και σας βοηθά να καταλάβετε πότε και τι να δημιουργήσετε αντίγραφα ασφαλείας:
Τι πρέπει να κρατηθεί |
Πότε είναι απαραίτητο το Backup; |
Αντίγραφο ασφαλείας MBR |
Μετά το FDISK. Το MBR δημιουργείται από την εντολή FDISK DOS. Μπορείτε να δημιουργήσετε αντίγραφα ασφαλείας του MBR μετά το FDISK, ωστόσο, ακόμη και μετά τη ΜΟΡΦΟΠΟΙΗΣΗ κατατμήσεων που δημιουργήθηκαν από το FDISK, το MBR παραμένει αμετάβλητο. |
Δημιουργία αντιγράφων ασφαλείας DBR |
Μετά τη μορφοποίηση, δημιουργήστε ένα αντίγραφο ασφαλείας DBR για κάθε λογικό δίσκο. |
Δημιουργία αντιγράφων ασφαλείας καταχωρήσεων και καταλόγων FAT. |
Οι καταχωρήσεις FAT και καταλόγου αλλάζουν κάθε φορά που δημιουργείτε ή διαγράφετε αρχεία ή καταλόγους. Επομένως, συνιστάται να δημιουργείτε ένα αντίγραφο ασφαλείας καθημερινά. |
Δημιουργία αντιγράφων ασφαλείας δεδομένων χρήστη |
Πρέπει να γίνεται τακτικά. Αυτός ο τύπος δημιουργίας αντιγράφων ασφαλείας έχει ως αποτέλεσμα τη δημιουργία εικόνας δίσκου. Ωστόσο, αυτό είναι χρονοβόρο, αλλά οι περισσότερες εταιρείες που έχουν πολύ ευαίσθητα δεδομένα στις μονάδες δίσκου τους θέλουν να αφιερώνουν το χρόνο τους δημιουργώντας μια εικόνα δίσκου, επειδή με αυτόν τον τρόπο μπορούν να δημιουργήσουν αντίγραφα ασφαλείας όλων των πληροφοριών που περιγράφονται παραπάνω. |
Επιπλέον, θα πρέπει να δημιουργήσετε έναν δίσκο εκκίνησης έκτακτης ανάγκης για το σύστημα. Εάν συμβεί κάποιο ατύχημα με τα δεδομένα στον σκληρό σας δίσκο, θα μπορείτε να εκκινήσετε το σύστημά σας χρησιμοποιώντας αυτήν τη δισκέτα και να αναλύσετε τη μονάδα για σφάλματα.
Δημιουργία αντιγράφων ασφαλείας MBR (Master Boot Record) και η χρήση του
Η κύρια εγγραφή εκκίνησης (MBR), ή μερικές φορές ονομάζεται πίνακας κύριου διαμερίσματος (MPT), περιέχει ένα μικρό πρόγραμμα για τη φόρτωση και την εκτέλεση του ενεργού (ή εκκινήσιμου) διαμερίσματος από τον σκληρό δίσκο. Η κύρια εγγραφή εκκίνησης περιέχει πληροφορίες και για τα τέσσερα κύρια διαμερίσματα.
Για μια λεπτομερή συζήτηση του MBR, ανατρέξτε στο κεφάλαιο "Λογική προσέγγιση για δίσκους και λειτουργικό σύστημα" που συζητήθηκε νωρίτερα σε αυτό το βιβλίο.
Το MBR βρίσκεται στον απόλυτο τομέα 0 ή μπορούμε να πούμε στον κύλινδρο 0, στην κεφαλή 0 και στον τομέα 1. Δημιουργείται στον σκληρό δίσκο εκτελώντας την εντολή FDISK.EXE DOS.
Γιατί να δημιουργήσετε αντίγραφο ασφαλείας του MBR:
Το MBR επιτρέπει στον τομέα εκκίνησης του ενεργού διαμερίσματος να αποκτήσει έλεγχο κατά την εκκίνηση του συστήματος.
Μετά τον αυτόματο έλεγχο ενεργοποίησης (POST), το BIOS φορτώνει το MBR (Master Boot Record) από τον σκληρό δίσκο στη μνήμη και στη συνέχεια το εκτελεί. Πρώτα, το MBR ελέγχει τον σκληρό δίσκο για ενεργό διαμέρισμα, στη συνέχεια φορτώνει την εγγραφή εκκίνησης του DOS (DBR) στη μνήμη και μεταβιβάζει τον έλεγχο στον κωδικό εκκίνησης του λειτουργικού συστήματος και, στη συνέχεια, ο κωδικός εγγραφής εκκίνησης του λειτουργικού συστήματος φορτώνει το υπόλοιπο λειτουργικό σύστημα στη μνήμη.
Επομένως, μπορούμε να πούμε ότι εάν το MBR του δίσκου είναι κατεστραμμένο, ο σκληρός δίσκος είναι πρακτικά νεκρός και το σύστημα δεν μπορεί να εκκινήσει ή να εκτελέσει εντελώς το λειτουργικό σύστημα. Σε αυτήν την κατάσταση, όλα τα δεδομένα που είναι αποθηκευμένα στον σκληρό δίσκο γίνονται απρόσιτα. Συνήθως, τα μηνύματα σφάλματος εμφανίζονται ως εξής:
"Μη έγκυρος πίνακας διαμερισμάτων" "Σφάλμα κατά τη φόρτωση του λειτουργικού συστήματος" "Λείπει λειτουργικό σύστημα"
Τι μπορεί να αποκατασταθεί χρησιμοποιώντας ένα αντίγραφο ασφαλείας MBR;
Η δημιουργία αντιγράφων ασφαλείας MBR μπορεί να σας βοηθήσει να απαλλαγείτε από τα παραπάνω μηνύματα σφάλματος. Χρησιμοποιώντας τη δημιουργία αντιγράφων ασφαλείας, μπορείτε να διορθώσετε τα ακόλουθα προβλήματα:
- Σφάλμα κατά τη φόρτωση του λειτουργικού συστήματος λόγω κατεστραμμένου IPL (αρχικός φορτωτής προγράμματος)
- Χαμένα κύρια τμήματα
- Κατεστραμμένες πληροφορίες διαμερίσματος
- Λάθος μαγικός αριθμός
Γράψτε ένα πρόγραμμα για τη δημιουργία αντιγράφου ασφαλείας MBR:
/* Πρόγραμμα δημιουργίας αντιγράφων ασφαλείας MBR */
#include <bios.h>
#include <stdio.h>
int main (κενό)
{
struct diskinfo_t dinfo; /* Δομή για αποθήκευση
πληροφορίες παραμέτρων δίσκου */
αποτέλεσμα int?
αριθμός ακεραίων = 0;
όνομα αρχείου char[80]; /* Αποθηκεύει το όνομα του αρχείου που δόθηκε
Χρήστης */
στατικό char dbuf[512]; /* Buffer δεδομένων 512 Byte */
ΑΡΧΕΙΟ *fp;
dinfo.drive = 0x80; /* αριθμός μονάδας δίσκου για First Hard
Δίσκος */
dinfo.head = 0; /* αριθμός κεφαλής δίσκου */
dinfo.track = 0; /* αριθμός κομματιού */
dinfo.sector = 1; /* αριθμός τομέα */
dinfo.nsectors = 1; /* καταμέτρηση τομέα */
dinfo.buffer = dbuf; /* buffer δεδομένων */
printf("\n Εισαγάγετε το όνομα αρχείου και τη διαδρομή για την αποθήκευση του
Αντίγραφο ασφαλείας του MBR \n ");
gets(όνομα αρχείου);
// Ανοίξτε το αρχείο για αποθήκευση του αντιγράφου ασφαλείας MBR \\
if((fp=fopen(όνομα αρχείου,"wb"))==NULL)
{
printf("Δεν ήταν δυνατή η δημιουργία αρχείου, πατήστε οποιοδήποτε πλήκτρο για
Εξοδος...");
getch();
exit(0);
}
printf("Προσπάθεια ανάγνωσης από μονάδα σκληρού δίσκου :\n");
//// Διαβάστε τον καθορισμένο τομέα δίσκου \\\\
αποτέλεσμα = _bios_disk(_DISK_READ, &dinfo);
αν ((αποτέλεσμα & 0xff00) == 0)
{
printf("Ανάγνωση δίσκου από μονάδα σκληρού δίσκου:
επιτυχής.\n");
/// Γράψτε 512 Byte MBR στο Αρχείο \\\\
ενώ (count<512)
{
fprintf(fp,"%c", dbuf[count] & 0xff );
count++;
}
fclose(fp);
}
αλλού
printf("Δεν είναι δυνατή η ανάγνωση της μονάδας σκληρού δίσκου, κατάσταση = 0x%02x\n", αποτέλεσμα);
επιστροφή 0;
}
Σχόλια σχετικά με την κωδικοποίηση προγράμματος:
Στην κωδικοποίηση προγράμματος που δόθηκε προηγουμένως, βασικά προχωράμε στην εκτέλεση των παρακάτω εργασιών βήμα προς βήμα:
- Το dinfo δείχνει στη δομή diskinfo_t που περιέχει τις πληροφορίες των παραμέτρων που απαιτούνται από τη λειτουργία που εκτελείται από τη συνάρτηση _bios_disk.
- Εφόσον θέλουμε να διαβάσουμε τον πρώτο τομέα του δίσκου, η θέση του τομέα θα είναι η εξής:
Παράμετρος |
Τι σημαίνει |
dinfo.drive = 0x80 |
Υποδεικνύει τη φυσική μονάδα 80H που είναι η πρώτη μονάδα σκληρού δίσκου. |
dinfo.head = 0 |
Δείχνει στον αριθμό κεφαλής 0 |
dinfo.track = 0 |
Δείχνει στο κομμάτι 0 |
dinfo.sector = 1 |
Πρώτος τομέας της δισκέτας που είναι ο τομέας 1 |
dinfo.sector = 1 |
>Αριθμός τομέων που πρέπει να ληφθούν υπόψη για λειτουργία ανάγνωσης = 1 |
dinfo.buffer = dbuf |
Προσωρινή μνήμη δεδομένων για τη λειτουργία |
- Ανοίξτε μια ροή αρχείου με όνομα αρχείου και διαδρομή που έχει δοθεί από το χρήστη για να αποθηκεύσετε το αντίγραφο ασφαλείας του MBR με ακρίβεια 512 byte. Το όνομα του αρχείου και η διαδρομή αποθηκεύονται στο όνομα αρχείου του πίνακα χαρακτήρων.
- Το _bios_disk(_DISK_READ, &dinfo) διαβάζει τον πρώτο τομέα του σκληρού δίσκου (80H), που καθορίζεται από το dinfo.
- Η κατάσταση που επιστράφηκε, αποθηκεύεται ως αποτέλεσμα που χρησιμοποιείται για την εμφάνιση του μηνύματος για επιτυχή λειτουργία ή για την εμφάνιση μηνύματος σφάλματος στην οθόνη εάν παρουσιαστεί κάποιο σφάλμα.
Πρόγραμμα επαναφοράς του MBR από το Backup:
Εάν το MBR είναι κατεστραμμένο, το πρόγραμμα που δίνεται στη συνέχεια βοηθά στην επαναφορά του MBR Back.
Θα πρέπει πάντα να έχετε κατά νου ότι η παράνομη χρήση ή η χρήση ελλιπούς γνώσης αυτού του προγράμματος μπορεί να καταστρέψει τις πληροφορίες δεδομένων σας στον σκληρό δίσκο και να καταστήσει απρόσιτα όλα τα δεδομένα. Θα πρέπει να είστε σίγουροι για το τι πρόκειται να κάνετε. Διαφορετικά μπορεί να περιπλέκετε περισσότερο το πρόβλημα.
Πρόγραμμα επαναφοράς του MBR από το Backup:
Η κωδικοποίηση του προγράμματος έχει ως εξής:
/* Πρόγραμμα για την επαναφορά του αντιγράφου ασφαλείας του MBR από το αρχείο αντιγράφου ασφαλείας */
#include <bios.h>
#include <stdio.h>
int main (κενό)
{
struct diskinfo_t dinfo;
int αποτέλεσμα?
int count=0;
όνομα αρχείου char[80]; /* Αποθηκεύει το όνομα του αρχείου που δόθηκε
από χρήστη */
στατικό char dbuf[512]; /* Προσωρινή μνήμη δεδομένων 512 Byte
*/
ΑΡΧΕΙΟ *fp;
/* Λάβετε την είσοδο χρήστη για τη διαδρομή αρχείου αντιγράφων ασφαλείας MBR */
printf("\n Εισαγάγετε το όνομα αρχείου και τη διαδρομή του αρχείου αντιγράφου ασφαλείας του
MBR \n ");
gets(όνομα αρχείου);
if((fp=fopen(όνομα αρχείου"rb"))==NULL)
{
printf("Δεν ήταν δυνατό το άνοιγμα του αρχείου αντιγράφου ασφαλείας, πατήστε οποιοδήποτε πλήκτρο
για έξοδο...");
getch();
exit(1);
}
/* Τα δεδομένα MBR πρέπει να είναι Ακριβώς 512 Byte */
ενώ (count<512)
{
fscanf(fp,"%c",&dbuf[count]);
count++;
}
fclose(fp);
printf("Προσπάθεια εγγραφής στη μονάδα σκληρού δίσκου :\n");
dinfo.drive = 0x80; /* αριθμός μονάδας δίσκου για το First
Σκληρός Δίσκος */
dinfo.head = 0; /* αριθμός κεφαλής δίσκου */
dinfo.track = 0; /* αριθμός κομματιού */
dinfo.sector = 1; /* αριθμός τομέα */
dinfo.nsectors = 1; /* καταμέτρηση τομέα */
dinfo.buffer = dbuf; /* buffer δεδομένων */
αποτέλεσμα = _bios_disk(_DISK_WRITE, &dinfo);
αν ((αποτέλεσμα & 0xff00) == 0)
{
printf("Επαναφορά του αντιγράφου ασφαλείας του MBR στο δίσκο
Τομέας: επιτυχημένος.\n");
}
αλλού
printf("Δεν είναι δυνατή η εγγραφή σε μονάδα σκληρού δίσκου, κατάσταση =
0x%02x\n", αποτέλεσμα);
επιστροφή 0;
}
Σχόλια σχετικά με την κωδικοποίηση προγράμματος:
Στην κωδικοποίηση προγράμματος που δίνεται παραπάνω, βασικά προχωράμε στην εκτέλεση των παρακάτω εργασιών βήμα προς βήμα:
- Το dinfo δείχνει στη δομή diskinfo_t που περιέχει τις πληροφορίες των παραμέτρων που απαιτούνται από τη λειτουργία που εκτελείται από τη συνάρτηση _bios_disk.
- Εφόσον θέλουμε να γράψουμε στον πρώτο τομέα του δίσκου, η θέση του τομέα θα είναι η εξής:
Παράμετρος |
Τι σημαίνει |
dinfo.drive = 0x80 |
Υποδεικνύει τη φυσική μονάδα 80H που είναι η πρώτη μονάδα σκληρού δίσκου. |
dinfo.head = 0 |
Δείχνει στον αριθμό κεφαλής 0 |
dinfo.track = 0 |
Δείχνει στο κομμάτι 0 |
dinfo.sector = 1 |
Πρώτος τομέας της δισκέτας που είναι ο τομέας 1 |
dinfo.sector = 1 |
Αριθμός τομέων που πρέπει να ληφθούν υπόψη για λειτουργία ανάγνωσης = 1 |
dinfo.buffer = dbuf |
Προσωρινή μνήμη δεδομένων για τη λειτουργία |
- Το όνομα αρχείου και η διαδρομή του Backup of MBR, που δίνονται από τον χρήστη, αποθηκεύονται στο όνομα αρχείου του πίνακα χαρακτήρων. Θα πρέπει να ληφθεί υπόψη ότι οι πληροφορίες MBR πρέπει να είναι Ακριβώς 512 byte.
- Το _bios_disk(_DISK_WRITE, &dinfo) εγγράφει τα δεδομένα στον πρώτο τομέα του σκληρού δίσκου (80H), που καθορίζεται από το dinfo.
- Η κατάσταση που επιστράφηκε, αποθηκεύεται ως αποτέλεσμα που χρησιμοποιείται για την εμφάνιση του μηνύματος για επιτυχή λειτουργία ή για την εμφάνιση μηνύματος σφάλματος στην οθόνη εάν παρουσιαστεί κάποιο σφάλμα.
Backup του DBR (DOS Boot Record) και η χρήση του
Μετά τον πίνακα διαμερισμάτων, το DOS Boot Record (DBR) ή μερικές φορές ονομάζεται DOS Boot Sector είναι η δεύτερη πιο σημαντική πληροφορία στον σκληρό σας δίσκο.
Για μια λεπτομερή μελέτη σχετικά με το DBR, ανατρέξτε στο κεφάλαιο, « Λογική προσέγγιση σε δίσκους και λειτουργικό σύστημα », που συζητήθηκε νωρίτερα σε αυτό το βιβλίο.
Ο πρώτος λογικός τομέας κάθε διαμερίσματος DOS θα περιέχει ένα DOS Boot Record (DBR) ή DOS Boot Sector. Η δουλειά του DBR είναι να φορτώσει το λειτουργικό σύστημα από τη μονάδα σκληρού δίσκου στην κύρια μνήμη του υπολογιστή και να δώσει τον έλεγχο του συστήματος στο φορτωμένο πρόγραμμα.
Το DOS Boot Record (DBR) για το πρώτο διαμέρισμα σε έναν σκληρό δίσκο βρίσκεται συνήθως στον Absolute Sector 63 (ο 64ος τομέας στη μονάδα δίσκου) ή σε μορφή CHS μπορούμε να πούμε C–H–S = 0–1–1 για τις περισσότερες μονάδες δίσκου.
Ωστόσο, αυτή η τοποθεσία μπορεί να διαφέρει ανάλογα με το SPT (Sectors per Track) του Drive. Για παράδειγμα, σε μια παλιά μονάδα δίσκου 245 MB με μόνο 31 SPT, η εγγραφή εκκίνησης βρισκόταν στον 32ο τομέα (Absolute Sector 31).
Το DBR δημιουργείται με την εντολή FORMAT του DOS, αφού γίνει η κατάτμηση χρησιμοποιώντας την εντολή FDISK. Ο τομέας στον οποίο βρίσκεται το DBR γίνεται λογικός τομέας 1 αυτού του συγκεκριμένου διαμερίσματος για το DOS. Ο αριθμός τομέα που χρησιμοποιείται από το DOS ξεκινά από τον φυσικό τομέα στον οποίο βρίσκεται το DBR.
Το DBR περιέχει ένα μικρό πρόγραμμα το οποίο εκτελείται από το εκτελέσιμο πρόγραμμα Master Boot Record (MBR). Όλα τα διαμερίσματα DOS περιέχουν τον κωδικό προγράμματος για την εκκίνηση του μηχανήματος, δηλαδή τη φόρτωση του λειτουργικού συστήματος, αλλά μόνο σε αυτό το διαμέρισμα δίνεται ο έλεγχος από το Master Boot Record, το οποίο, όπως ορίζεται ως ενεργό διαμέρισμα, στην καταχώρηση του πίνακα κατατμήσεων.
Γιατί να δημιουργήσετε αντίγραφα ασφαλείας DBR:
Το DBR περιέχει ορισμένες σημαντικές πληροφορίες σχετικά με τη γεωμετρία του δίσκου. Αυτές οι πληροφορίες βρίσκονται στον πρώτο τομέα κάθε διαμερίσματος, όπως:
- Κωδικός μετάβασης + NOP
- Όνομα και έκδοση OEM
- Bytes ανά τομέα
- Τομείς ανά σύμπλεγμα
- Αποθεματικοί Τομείς
- Αριθμός αντιγράφων FAT
- Μέγιστες καταχωρήσεις καταλόγου ρίζας (αλλά δεν είναι διαθέσιμες για το FAT32)
- Αριθμός τομέων σε διαμέρισμα μικρότερο από 32 MB (επομένως δεν είναι διαθέσιμο για FAT32)
- Περιγραφέας πολυμέσων (F8H για σκληρούς δίσκους)
- Τομείς ανά λίπος (σε παλαιότερα συστήματα FAT και μη διαθέσιμοι για FAT32)
- Τομείς ανά διαδρομή
- Αριθμός Κεφαλών
- Αριθμός κρυφών τομέων στο διαμέρισμα
- Αριθμός Τομέων σε Κατάτμηση
- Αριθμός Τομέων ανά FAT
- Σημαίες περιγραφής πληροφοριών FAT
- Έκδοση μονάδας δίσκου FAT32
- Αριθμός συμπλέγματος της έναρξης του καταλόγου ρίζας
- Αριθμός Τομέα του Τομέα Πληροφοριών Συστήματος Αρχείων
- Αριθμός τομέα του τομέα εκκίνησης αντιγράφων ασφαλείας
- Ρεζερβέ
- Λογικός αριθμός διαμερίσματος μονάδας δίσκου
- Εκτεταμένη υπογραφή (29H)
- Σειριακός αριθμός διαμερίσματος
- Όνομα τόμου του διαμερίσματος
- FAT Όνομα
- Εκτελέσιμος κώδικας
- Εκτελέσιμος δείκτης ή μαγικός αριθμός (AAH 55H)
Γενικά, στην οθόνη εμφανίζονται τα ακόλουθα μηνύματα σφάλματος:
"Αποτυχία εκκίνησης δίσκου"
"Σφάλμα εκτός συστήματος δίσκου ή δίσκου"
"Μη έγκυρος δίσκος συστήματος ή σφάλμα εισόδου/εξόδου δίσκου"
«Αντικαταστήστε το δίσκο και μετά πατήστε οποιοδήποτε πλήκτρο…»
Τι μπορεί να ανακτηθεί με το Backup του DBR;
Η δημιουργία αντιγράφων ασφαλείας του DBR μπορεί να σας βοηθήσει να απαλλαγείτε από τα παραπάνω μηνύματα Σφάλματος. Αυτά τα μηνύματα λάθους Στην οθόνη περιμένετε να τοποθετήσει ο χρήστης έναν δίσκο εκκίνησης με τα προαναφερθέντα προγράμματα στη μονάδα δισκέτας και να πατήσει ένα πλήκτρο.
Η μονάδα δίσκου θα πρέπει να είναι προσβάσιμη εάν εκκινήσετε το σύστημα από τη δισκέτα ή το CD με δυνατότητα εκκίνησης. Παρόλο που ο σκληρός δίσκος δεν είναι εκκινήσιμος, γενικά αυτό δεν πρέπει να επηρεάζει την πρόσβαση στα δεδομένα της μονάδας δίσκου. Μετά την εκκίνηση του συστήματος με τον εκκινήσιμο δίσκο, μπορείτε να έχετε πρόσβαση στα δεδομένα.
Με την επαναφορά του αντιγράφου ασφαλείας του DBR μπορείτε να ξεπεράσετε τα προβλήματα που δημιουργούνται, όπως αναφέρθηκε παραπάνω.
Προγράμματα για τη δημιουργία και επαναφορά αντιγράφων ασφαλείας του DBR:
Τα προγράμματα για τη δημιουργία αντιγράφων ασφαλείας των DBR και την επαναφορά τους είναι σχεδόν παρόμοια με τα προγράμματα του MBR backup και για επαναφορά.
Για παράδειγμα, εάν πρόκειται να γράψετε τα προγράμματα για τη δημιουργία αντιγράφων ασφαλείας του DBR της Πρώτης λογικής μονάδας δίσκου και να την επαναφέρετε ξανά, οι παράμετροι που καθορίζονται από τη δομή dinfo θα αλλάξουν ως εξής:
Παράμετρος |
Τι σημαίνει |
dinfo.drive = 0x80 |
Υποδεικνύει τη φυσική μονάδα 80H που είναι η πρώτη μονάδα σκληρού δίσκου> |
dinfo.head = 1 |
Δείχνει στον αριθμό 1 |
dinfo.track = 0 |
Δείχνει στο κομμάτι 0 |
dinfo.sector = 1 |
Πρώτος τομέας της δισκέτας που είναι ο τομέας 1 |
dinfo.sector = 1 |
Αριθμός τομέων που πρέπει να ληφθούν υπόψη για λειτουργία ανάγνωσης = 1 |
dinfo.buffer = dbuf |
Προσωρινή μνήμη δεδομένων για τη λειτουργία |
Εδώ βλέπουμε ότι αλλάζει μόνο η θέση του τομέα ανάγνωσης/εγγραφής. Εδώ το CHS δίνεται ως 0-1-1 καθώς το DBR της πρώτης λογικής μονάδας είναι αποθηκευμένο εδώ.
Πλήρης απεικόνιση δίσκου
Αυτός ο τύπος δημιουργίας αντιγράφων ασφαλείας γίνεται όλο και πιο δημοφιλής σήμερα και προτιμάται περισσότερο από τέτοιους οργανισμούς που έχουν πολύ ευαίσθητα δεδομένα στα συστήματά τους. Αυτοί οι άνθρωποι δεν μπορούν να πάρουν καμία πιθανότητα ούτε ένα τοις εκατό απώλειας δεδομένων.
Τέτοιοι οργανισμοί λαμβάνουν τακτικά τα αντίγραφα ασφαλείας τους ως ολόκληρη την εικόνα δίσκου. Αν και χρειάζεται λίγος χρόνος, αλλά σας δίνει βεβαιότητα ότι δεν θα χάσετε τίποτα. Λόγω της αυξανόμενης δημοτικότητάς του, οι προγραμματιστές προσπάθησαν να κάνουν το λογισμικό απεικόνισης δίσκου όλο και πιο γρήγορο για να ελαχιστοποιήσουν τη χρονική περίοδο που απαιτείται από τη διαδικασία απεικόνισης.
Η απεικόνιση του δίσκου είναι μια καλή ιδέα γιατί απλώς ξοδεύοντας μερικές δεκάδες λεπτά μπορείτε να κατανοήσετε ότι έχετε αντίγραφο ασφαλείας των πάντων στην τσέπη σας. Όλοι οι παράγοντες όπως MBR, BDR, FATs, Root Directories αντιγράφονται στο δίσκο προορισμού ως έχει.
Αυτό που χρειαζόμαστε για την απεικόνιση δίσκου είναι ένας Πανομοιότυπος (ή σχεδόν Πανομοιότυπος) σκληρός δίσκος προορισμού, με τον σκληρό δίσκο προέλευσης στον οποίο έχουμε τα πολύτιμα δεδομένα μας. Ένα πράγμα λαμβάνεται πάντα υπόψη ότι ο δίσκος προορισμού δεν πρέπει να είναι μικρότερος από τον δίσκο προέλευσης.
Αφού τραβήξετε την πλήρη εικόνα, εάν εκκινήσετε το σύστημα με τον δίσκο προορισμού, στον οποίο έχετε τραβήξει την εικόνα του δίσκου, γενικά θα λάβετε όλα τα δεδομένα ως έχουν.
Σύνταξη του προγράμματος για πλήρη απεικόνιση δίσκου
Το πρόγραμμα για την απεικόνιση του δίσκου έχει δοθεί στη συνέχεια. Το Πρόγραμμα χρησιμοποιεί τις επεκτάσεις INT 13H, επομένως μπορεί να υποστηρίξει και μεγάλους δίσκους.
Το πρόγραμμα μεταφέρει την εικόνα της πρώτης φυσικής μονάδας σκληρού δίσκου (0x80) στη δεύτερη φυσική μονάδα σκληρού δίσκου (0x81), επομένως πριν δημιουργήσετε το αντίγραφο ασφαλείας θα πρέπει να έχετε υπόψη ότι όλα τα δεδομένα στο δίσκο προορισμού (0x81) θα αντικατασταθούν από τα δεδομένα του δίσκου προέλευσης (0x80) ανά τομέα.
Η κωδικοποίηση του προγράμματος έχει δοθεί παρακάτω:
/* Πρόγραμμα για τη δημιουργία της εικόνας του πρώτου σκληρού δίσκου (0x80) στον δεύτερο σκληρό δίσκο (0x81) */
#include<stdio.h>
#include<dos.h>
#include<conio.h>
/* Δομή που θα χρησιμοποιηθεί από τη συνάρτηση getdrivegeometry χρησιμοποιώντας την επέκταση INT 13H, Αριθμός συνάρτησης 0x48. */
γεωμετρία κατασκευής
{
ανυπόγραφο μέγεθος int ; /* (κλήση) μέγεθος buffer */
ανυπόγραφες σημαίες int ; /* Σημαίες πληροφοριών */
ανυπόγραφο μακρύ κύλινδρο ; /* Αριθμός Φυσικών
Κύλινδροι στο Drive */
ανυπόγραφες μακριές κεφαλές ;/* Αριθμός Φυσικών
Heads on Drive */
ανυπόγραφο long spt ; /* Αριθμός Φυσικών
Τομείς ανά κομμάτι */
ανυπόγραφοι μακροί τομείς[2] ; /* Συνολικός αριθμός των
Τομείς στο Drive */
ανυπόγραφο int bps ; /* Bytes ανά τομέα */
} ;
/* Δομή μορφής πακέτου διεύθυνσης δίσκου, για χρήση από τις συναρτήσεις, readabsolutesectors και writeabsolutesectors */
struct diskaddrpacket
{
char packetsize ; /* Μέγεθος πακέτου, γενικά 10H */
char κρατημένο ; /* Κράτηση (0) */
int blockcount ; /* Αριθμός μπλοκ προς μεταφορά */
char far *bufferaddress ; /* διεύθυνση στο Transfer
Buffer */
ανυπόγραφος μακρύς αριθμός μπλοκ[2] ; /* Απόλυτο εκκίνησης
Αριθμός μπλοκ */
} ;
///// Λειτουργία για λήψη παραμέτρων μονάδας δίσκου \\\\\
ανυπόγραφο long getdrivegeometry (int drive)
{
ένωση REGS i, o ;
struct SREGS s ;
γεωμετρία δομής g = { 26, 0, 0, 0, 0, 0, 0, 0 } ;
ihah = 0x48 ; /* Αριθμός συνάρτησης 0x48 του INT 13H
Επεκτάσεις Δείτε τα σχόλια
Παρακάτω */
ihdl = οδηγώ; /* Αριθμός μονάδας */
ixsi = FP_OFF ( (κενό μακριά*)&g ) ;
s.ds = FP_SEG ( (κενό μακριά*)&g ) ;
/* Κλήση του καθορισμένου αριθμού συνάρτησης της επέκτασης INT 13H με τιμές καταχώρησης τμήματος */
int86x ( 0x13, &i, &o, &s );
printf("\n Κεφαλή = %lu, Τομείς ανά ίχνος = %lu, κύλινδρος =
%lu\n", g.heads, g.spt, g.cyl);
/* Εάν αποτύχει η συνάρτηση γεωμετρίας λήψης μονάδας δίσκου, Εμφάνιση μηνύματος σφάλματος και έξοδος */
if(g.spt==0)
{
printf("\n Λήψη της συνάρτησης γεωμετρίας μονάδας δίσκου αποτυγχάνει...");
printf("\n Οι επεκτάσεις δεν υποστηρίζονται, πατήστε οποιοδήποτε πλήκτρο για
Εξοδος...");
getch();
exit(1);
}
επιστροφή *g.sectors; /* Επιστροφή Ο Αριθμός Τομέων
στο Drive */
}
////// Start Of Main \\\\\\
void main()
{
unsigned long loop=0, Sectors_in_HDD1=0, Sectors_in_HDD2=0;
ανυπόγραφο buffer χαρακτήρων[61440]; /* Προσωρινή μνήμη δεδομένων 61440
Byte για ανάγνωση/εγγραφή 120 τομείς των 512 byte κάθε φορά για εξοικονόμηση χρόνου. */
char επιλογή?
clrscr();
/* Εάν ο συνολικός αριθ. των συνδεδεμένων σκληρών δίσκων είναι λιγότερο από δύο Εμφάνιση Μήνυμα Σφάλματος και Έξοδος. */
if(((char)peekb(0x0040, 0x0075))<2)
{
printf("\n\n Πρέπει να έχετε τουλάχιστον δύο σκληρούς δίσκους
Συνημμένο στον υπολογιστή σας για να το εκτελέσετε");
printf("\n Πρόγραμμα. Πατήστε οποιοδήποτε πλήκτρο για έξοδο...");
getch();
exit(1);
}
/// Λήψη παραμέτρων του πρώτου σκληρού δίσκου (0x80) \\\
Sectors_in_HDD1 = getdrivegeometry (0x80);
printf(" Σύνολο τομείς στον πρώτο σκληρό δίσκο = %lu\n\n",
Sectors_in_HDD1);
/// Λήψη παραμέτρων του δεύτερου δίσκου Hsrd (0x81) \\\
Sectors_in_HDD2 = getdrivegeometry (0x81);
printf(" Συνολικοί τομείς σε δεύτερο σκληρό δίσκο = %lu\n\n",
Sectors_in_HDD2);
/// Πρώτα επιβεβαιώστε, μετά προχωρήστε \\\
printf("\n Όλα τα δεδομένα στον δεύτερο σκληρό δίσκο θα είναι
χαμένος!!!");
printf("\n Πατήστε \'Y\' για Συνέχεια, αλλιώς οποιοδήποτε πλήκτρο για
Έξοδος...");
επιλογή = getche();
διακόπτης (επιλογή)
{
περίπτωση 'y':
περίπτωση 'Y':
διακοπή;
αθέτηση:
exit(0);
}
/* Ο προορισμός δεν πρέπει να είναι μικρότερος από την πηγή */
if(Sectors_in_HDD2<Sectors_in_HDD1)
{
printf("\n\n Ο δίσκος προορισμού δεν πρέπει να είναι μικρότερος
από τον δίσκο προέλευσης");
printf("\n Πατήστε οποιοδήποτε πλήκτρο για έξοδο...");
getch();
exit(0);
}
/* Εάν όλα είναι εντάξει, αντιγράψτε όλους τους τομείς του δίσκου προέλευσης στον σκληρό δίσκο προορισμού */
gotoxy(10,15);printf("Copying Absolute Sector: ");
for(loop=0;loop< =Sectors_in_HDD1;loop=loop+120)
{
readabsolutesectors ( 0x80, loop, 120, buffer );
writeabsolutesectors ( 0x81, loop, 120, buffer );
gotoxy(36,15); printf("%ld",loop);
if(kbhit())
{
exit(0);
}
}
//// Εμφάνιση του μηνύματος ολοκλήρωσης \\\
printf("\n\n Η απεικόνιση δίσκου έχει πλέον ολοκληρωθεί, πατήστε οποιοδήποτε πλήκτρο
Για έξοδο...");
getch();
}
//// Τέλος κύριας
Σχόλια σχετικά με την κωδικοποίηση:
Στην κωδικοποίηση του προγράμματος που δόθηκε προηγουμένως, για την απεικόνιση δίσκου Προχωράμε εκτελώντας τις ακόλουθες εργασίες:
- Το Structure, geometry χρησιμοποιείται από τη συνάρτηση getdrivegeometry χρησιμοποιώντας την επέκταση INT 13H, Αριθμός συνάρτησης 0x48. Για μια λεπτομερή περιγραφή των επεκτάσεων INT 13H, ανατρέξτε στο κεφάλαιο «Χειρισμός μεγάλων σκληρών δίσκων», που συζητήθηκε νωρίτερα σε αυτό το βιβλίο.
Οι τύποι δεδομένων που αντιπροσωπεύουν πολλές παραμέτρους του δίσκου έχουν τις ακόλουθες έννοιες:
Τύπος δεδομένων |
Μέγεθος σε Bytes |
Περιγραφή |
ανυπόγραφο μέγεθος int |
2 Byte |
Μέγεθος buffer |
ανυπόγραφες σημαίες int |
2 Byte |
Σημαίες πληροφοριών |
ανυπόγραφο μακρύ κύλ |
4 Byte |
Αριθμός φυσικών κυλίνδρων στο Drive |
ανυπόγραφα μακριά κεφάλια |
4 Byte |
Αριθμός φυσικών κεφαλών στο Drive |
ανυπόγραφο μακρύ σπτ |
4 Byte |
Αριθμός φυσικών τομέων ανά κομμάτι |
ανυπόγραφοι μακροί τομείς[2] |
8 Byte |
Συνολικός αριθμός τομέων στο Drive |
ανυπόγραφο int bps |
2 Byte |
Bytes ανά τομέα |
- Η δομή diskaddrpacket χρησιμοποιείται από τις συναρτήσεις readabsolutesectors και writeabsolutesectors. Η μορφή του πακέτου διευθύνσεων δίσκου έχει δοθεί στον ακόλουθο πίνακα:
Τύπος δεδομένων |
Μέγεθος σε Bytes |
Περιγραφή |
char packets size |
1 Byte |
Μέγεθος πακέτου, γενικά 10H |
char κρατήθηκε |
1 Byte |
Κράτηση (0) |
int blockcount |
2 Byte |
Αριθμός μπλοκ προς μεταφορά |
char far *bufferaddress |
4 Byte |
διεύθυνση στο Transfer Buffer |
ανυπόγραφος μακρύς αριθμός μπλοκ[2] |
4 Byte |
Αρχικός αριθμός απόλυτου μπλοκ |
- Η συνάρτηση getdrivegeometry χρησιμοποιείται για τη λήψη των παραμέτρων της καθορισμένης μονάδας δίσκου. Η συνάρτηση getdrivegeometry χρησιμοποιεί τον αριθμό συνάρτησης 0x48 των επεκτάσεων INT 13H.
Η σημασία των παραμέτρων έχει περιγραφεί στον παρακάτω πίνακα:
Παράμετρος |
Τι σημαίνει |
ihah = 0x48 |
Αριθμός συνάρτησης 0x48 των επεκτάσεων INT 13H |
ihdl = οδηγώ |
Αριθμός μονάδας δίσκου |
ixsi = FP_OFF ( (κενό μακριά*)&g ) |
Διεύθυνση ds:si σε buffer για παραμέτρους μονάδας δίσκου όπως συζητήθηκε προηγουμένως |
s.ds = FP_SEG ( (κενό μακριά*)&g ) |
Διεύθυνση ds:si σε buffer για παραμέτρους μονάδας δίσκου όπως συζητήθηκε προηγουμένως |
Η συνάρτηση int86x(0x13, &i, &o, &s) καλεί τη διακοπή 13H με Τιμές καταχωρητή τμημάτων. Η συνάρτηση getdrivegeometry επιστρέφει τον συνολικό αριθμό στη μονάδα δίσκου.
- Στη συνάρτηση main(), (char)peekb(0x0040, 0x0075); (η συνάρτηση peekb ορίζεται στο DOS.H) επιστρέφει τον αριθμό των σκληρών δίσκων που είναι συνδεδεμένοι στο σύστημα.
Ο αριθμός των σκληρών δίσκων που είναι συνδεδεμένοι στο σύστημα αντιπροσωπεύεται από το byte που είναι αποθηκευμένο στη θέση μνήμης 0040H:0075H (Τμήμα 0040H: Offset 0075H). Εάν ο αριθμός των σκληρών δίσκων που είναι συνδεδεμένοι στο σύστημα είναι μικρότερος, τότε δύο πρόγραμμα εμφανίζει το μήνυμα σφάλματος και κλείνει.
Sectors_in_HDD1 = getdrivegeometry (0x80); παίρνει τις παραμέτρους του πρώτου σκληρού δίσκου (0x80) και επιστρέφει τον συνολικό αριθμό τομέων στον πρώτο σκληρό δίσκο.
Ομοίως Sectors_in_HDD2 = getdrivegeometry (0x81); παίρνει τις παραμέτρους του δεύτερου σκληρού δίσκου (0x81) και επιστρέφει τον συνολικό αριθμό τομέων στον δεύτερο σκληρό δίσκο.
Μετά την επιβεβαίωση από τον χρήστη ότι θα συνεχίσει με την απεικόνιση, ελέγξτε πρώτα την προϋπόθεση ότι το μέγεθος του σκληρού δίσκου προέλευσης δεν πρέπει να είναι μεγαλύτερο από το μέγεθος του σκληρού δίσκου προορισμού. Εάν ο προορισμός είναι μικρότερος, εμφανίστε το μήνυμα σφάλματος και βγείτε.
Εάν όλα πάνε σωστά, αντιγράψτε τους τομείς του δίσκου προέλευσης στον δίσκο προορισμού. Εδώ διαβάζουμε και γράφουμε 61440 Byte (120 τομείς με καθένα από τα 512 Byte) κάθε φορά για να κάνουμε τη διαδικασία απεικόνισης πιο γρήγορη.
Εάν θέλετε να χρησιμοποιήσετε περισσότερους τομείς ταυτόχρονα, ακόμη και πέρα από το όριο των 64K, μπορείτε να το κάνετε χρησιμοποιώντας το "huge Pointer" σε μοντέλο μεγάλης μνήμης. Το Παράδειγμα Προδιαγραφών είναι το εξής:
char τεράστια συστοιχία[100000L];
- Η συνάρτηση, readabsolutesectors ( 0x80, βρόχος, 120, buffer ); διαβάζει τους 120 τομείς του πρώτου σκληρού δίσκου (0x80), ξεκινώντας από τον αριθμό τομέα που καθορίζεται από τον ανυπόγραφο μακρύ βρόχο ακέραιου αριθμού και αποθηκεύει τα δεδομένα στην προσωρινή μνήμη δεδομένων.
- Η συνάρτηση, writeabsolutesectors ( 0x81, βρόχος, 120, buffer ); εγγράφει τα δεδομένα της προσωρινής μνήμης δεδομένων σε 120 τομείς του δεύτερου σκληρού δίσκου (0x81), ξεκινώντας από τον αριθμό τομέα που καθορίζεται από τον βρόχο μακρύ ακέραιο χωρίς υπογραφή.
Η κωδικοποίηση των συναρτήσεων readabsolutesectors ( ) και writeabsolutesectors ( ) έχει δοθεί στη συνέχεια:
//// Συνάρτηση ανάγνωσης απόλυτων τομέων \\\\
int readabsolutesectors (int drive,
ανυπόγραφος μακρύς αριθμός τομέα,
int numofsectors,
void *buffer )
{
ένωση REGS i, o ;
struct SREGS s ;
struct diskaddrpacket pp ;
pp.packetsize = 16 ; /* μέγεθος πακέτου = 10H */
pp.reserved = 0 ; /* Κράτηση = 0 */
pp.blockcount = numofsectors ; /* Αριθμός τομέων
να διαβάσω */
/* για προσωρινή μνήμη δεδομένων */
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void
far*)buffer), FP_OFF((void far*)buffer));
pp.blocknumber[0] = αριθμός τομέα ; /* Αριθμός τομέα
να διαβάσω */
pp.blocknumber[1] = 0 ; /* Αριθμός μπλοκ */
ihah = 0x42 ; /* Αριθμός συνάρτησης*/
ihdl = drive ; /* Αριθμός φυσικής μονάδας */
ixsi = FP_OFF ( (κενό μακριά*)&pp ) ; /* ds:si for
buffer παράμετροι */
s.ds = FP_SEG ( (κενό μακριά*)&pp ) ; /* ds:say for
buffer παράμετροι */
/* Κλήση της καθορισμένης συνάρτησης του INT 13H με τιμές καταχωρητή τμημάτων */
int86x ( 0x13, &i, &o, &s );
αν ( oxcflag==1)
επιστροφή 0 ; /*αποτυχία */
αλλού
επιστροφή 1 ; /* επιτυχία */
}
//// Συνάρτηση για τη γραφή απόλυτων τομέων \\\\
int writeabsolutesectors (int drive,
ανυπόγραφος μακρύς αριθμός τομέα,
int numofsectors,
void *buffer )
{
συνδικαλιστικό REGS i, o ;
δομή SREGS s;
struct diskaddrpacket pp ;
pp.packetsize = 16 ; /* Μέγεθος πακέτου = 10H */
pp.reserved = 0 ; /* Κράτηση = 0 */
pp.blockcount = numofsectors ; /* Αριθμός τομέων
θα γραφεται */
/* για προσωρινή μνήμη δεδομένων */
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void
far*)buffer), FP_OFF((void far*)buffer));
pp.blocknumber[0] = αριθμός τομέα ;/* Αριθμός τομέα
θα γραφεται */
pp.blocknumber[1] = 0 ; /* Αριθμός μπλοκ = 0 */
ihah = 0x43 ; /* Αριθμός συνάρτησης */
ihal = 0x00 ; /* Εισαγωγή σημαιών, βλ
σχόλια */
ihdl = drive ; /* Αριθμός φυσικού δίσκου*/
/* ds:si για παραμέτρους buffer */
ixsi = FP_OFF ( (κενό μακριά*)&pp ) ;
/* ds:si για παραμέτρους buffer */
s.ds = FP_SEG ( (κενό μακριά*)&pp ) ;
/* Κλήση της καθορισμένης συνάρτησης INT 13H με τις τιμές καταχωρητή τμημάτων */
int86x ( 0x13, &i, &o, &s );
αν ( oxcflag == 1)
επιστροφή 0 ; /* αποτυχία */
περισσότερο
επιστροφή 1 ; /* επιτυχία */
}
Σχόλια κωδικοποίησης:
Οι παράμετροι που χρησιμοποιούνται και από τις δύο συναρτήσεις έχουν τις ακόλουθες έννοιες:
Παράμετρος |
Μέγεθος σε byte |
Περιγραφή |
pp.packetsize = 16 ; |
1 byte |
Μέγεθος συσκευασίας = 10H |
pp.reserved = 0 ; |
1 byte |
Δεσμευμένο = 0 |
pp.blockcount = numofsectors ; |
2 byte |
Αριθμός τομέων προς ανάγνωση |
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void far*)buffer), FP_OFF((void far*)buffer)); |
----- |
για την προσωρινή μνήμη δεδομένων ή την προσωρινή μνήμη μετάδοσης |
pp.blocknumber[0] = τομέας_αριθμός; |
4 byte |
Αριθμός τομέα για ανάγνωση/εγγραφή (συνήθως χρειαζόμαστε μόνο αυτόν). Μόνο ξεχωριστά. Μπορεί να υποστηρίξει έως και 2,1 terabyte. |
pp.block_number[1] = 0 ; |
4 byte |
Αριθμός μπλοκ. Χρησιμοποιήστε το εάν έχετε πρόσβαση σε δίσκο μεγαλύτερο από 2,1 terabyte. |
ihah = 0x42; ή ihah = 0x43 ; |
2 byte |
Λειτουργία Αριθμός επεκτάσεων INT 13H |
ihal = 0x00 ; |
1 byte |
Οι σημαίες εγγραφής χρησιμοποιούνται μόνο στη συνάρτηση εγγραφής, τα 00H, 01H χρησιμοποιούνται για εγγραφή χωρίς επαλήθευση και τα 02H για εγγραφή με επαλήθευση. |
ihdl = drive ; |
2 byte |
Αριθμός φυσικού δίσκου |
ixsi = FP_OFF ( (κενό μακριά*)&pp ) ; |
------ |
ds:si για παραμέτρους buffer |
s.ds = FP_SEG ( (κενό μακριά*)&pp ) ; |
------ |
ds:si για παραμέτρους buffer |
int86x ( 0x13, &i, &o, &s ); |
------ |
Καλέστε την καθορισμένη συνάρτηση INT 13H με τις τιμές καταχωρητή τμημάτων |