Επιστρέφουμε στη σειρά μαθημάτων σχετικά με τον τρόπο δημιουργίας του δικού μας λειτουργικού συστήματος. Υποθέτω ότι θα σας αρέσει πολύ αυτό το κεφάλαιο, γιατί τελικά μπορούμε να αλληλεπιδράσουμε με το λειτουργικό μας σύστημα. Σήμερα θα διαβάσουμε την είσοδο πληκτρολογίου. Για αυτό, το σχήμα είναι παρόμοιο με αυτό του χρονοδιακόπτη. Πρέπει να χρησιμοποιήσουμε τα IRQ ούτως ή άλλως, έτσι θα ξεκινήσουμε το ίδιο με το χρονοδιακόπτη.
ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);
Ο χειριστής πληκτρολογίου μας, ωστόσο, είναι κάπως πιο περίπλοκος αφού διαβάζουμε τα πλήκτρα και τα καταθέτουμε σε ένα buffer.
extern "C" κενό ND_Keyboard_Handler (struct regs * r) {unsigned char scancode = ND :: Πληκτρολόγιο :: GetChar (); if (scancode! = 255) {ND :: Οθόνη :: PutChar (scancode); stringBuffer [stringPos] = scancode; stringPos ++; }}
http://gist.github.com/634afddcb3e977ea202d
Μπορούμε να ελέγξουμε πώς καλούμε μια συνάρτηση που ονομάζεται ND :: Keyboard :: GetChar. Εκεί παίρνουμε τον χαρακτήρα και, στη συνέχεια, εάν δεν είναι άδειος χαρακτήρας (εδώ έχω χρησιμοποιήσει 255, θα πρέπει να χρησιμοποιήσουμε ένα καλύτερο σύστημα) βάζουμε τον χαρακτήρα στην οθόνη και τον αποθηκεύουμε σε ένα απλό buffer chars (αυτό είναι επίσης υπόκειται σε βελτίωση, το τρέχον σύστημα μπορεί να ξεχειλίζει)
nsigned char ND :: Πληκτρολόγιο :: GetChar () {unsigned char scancode; scancode = (χωρίς υπογραφή char) ND :: Ports :: InputB (0x60); εάν (scancode & ND_KEYBOARD_KEY_RELEASE) {επιστροφή 255; } αλλιώς {return en_US [scancode]; }} char * ND :: Πληκτρολόγιο :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; επιστροφή stringBuffer; }
http://gist.github.com/2d4f13e0b1a281c66884
Εδώ μπορούμε να δούμε πώς λαμβάνεται το πλήκτρο που έχει πατηθεί. Στο 0x60 θα πατηθεί πάντα το τελευταίο πλήκτρο. Στην πραγματικότητα, μπορεί να διαβαστεί απευθείας χωρίς να χρειάζεται να χρησιμοποιήσετε το IRQ, αλλά τότε δεν θα ξέρουμε πώς να προσδιορίσουμε πότε έχει γίνει μια αλλαγή. Εκεί ελέγξουμε με τη λειτουργία AND ότι ο κωδικός που αποκτήσαμε αντιστοιχεί σε ένα κλειδί που έχει κυκλοφορήσει.
Σε αυτήν την περίπτωση επιστρέφουμε 255 (γιατί θα το αγνοήσουμε αργότερα) και αλλιώς το πλήκτρο έχει πατηθεί. Σε αυτήν την περίπτωση επιστρέφουμε τη θέση ενός πίνακα που ονομάζεται en_US. Τι πληροφορίες περιέχει αυτός ο πίνακας; Αυτός ο πίνακας είναι αυτό που θα ονομάζαμε έναν χάρτη κλειδιών ή έναν χάρτη χαρακτήρων. Όπως γνωρίζετε, διαφορετικές γλώσσες έχουν διαφορετικά πληκτρολόγια και δεν υποστηρίζονται καθώς αντικαθιστούν τα πλήκτρα. Έτσι, το en_US θα μας δώσει το κλειδί που αντιστοιχεί σε κάθε κωδικό και θα λειτουργεί σε αμερικανικό πληκτρολόγιο.
unsigned char en_US [128] = {0,27, "1", "2", "3", "4", "5", "6", "7", "8", "9", "0 ',' - ',' = ',' \ b ',' \ t ',' q ',' w ',' e ',' r ',' t ',' y ',' u ',' i ',' o ',' p ',' [','] ',' \ n ', 0, / * Ctrl * /' a ',' s ',' d ',' f ',' g ', 'h', 'j', 'k', 'l', ';', '\' ',' ', 0, / * Left Shift * /' \\ ',' z ',' x ', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Right shift * / '*', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10 keys * / 0, / * Num lock * / 0, / * Κλείδωμα κύλισης * / 0, / * Αρχική πλήκτρο * / 0, / * Επάνω βέλος * / 0, / * Σελίδα επάνω * / '-', 0, / * Αριστερό βέλος * / 0, 0, / * Δεξί βέλος * / '+', 0, / * Πλήκτρο τερματισμού * / 0, / * Κάτω βέλος * / 0, / * Σελίδα κάτω * / 0, / * Εισαγωγή κλειδιού * / 0, / * Διαγραφή κλειδιού * / 0,0,0, 0, 0, 11, / * Πλήκτρα F12-F0 * / XNUMX};
http://gist.github.com/bf52085aec05f3070b65
Υπήρχε επίσης μια καθορισμένη συνάρτηση που πήρε μια φράση. Ο σκοπός είναι απλώς η πιο εύκολη πρόσβαση στις συμβολοσειρές από τις εφαρμογές που τη χρειάζονται, προς το παρόν μόνο μία. Μιλώ για το NextShellLite, μια μειωμένη έκδοση του πιθανού μελλοντικού κελύφους που θα είχε το NextDivel. Ο σκοπός του NextShellLite είναι μόνο η παροχή μειωμένου κελύφους για τη σταδιακή δοκιμή νέων λειτουργιών. Δεν πρόκειται να βάλω τον κωδικό κελύφους εδώ αλλά τον έχω συμπεριλάβει στον κώδικα NextDivel.
Προς το παρόν δεν λειτουργεί ως ξεχωριστό πρόγραμμα, αλλά ως λειτουργία που καλείται από τον πυρήνα, κυρίως επειδή δεν έχουμε προσθέσει ακόμη την επιλογή εκτέλεσης εκτελέσιμων. Και φυσικά, μερικές εικόνες για το πώς λειτουργεί το κέλυφος με τις νέες λειτουργίες εισαγωγής πληκτρολογίου.
εξαιρετικός δάσκαλος! ευχαριστώ 🙂
Η αλήθεια είναι ότι δεν παρακολούθησα ποτέ το σεμινάριο γιατί στο πρώτο μέρος μου έδωσε ένα σφάλμα κατά την προσπάθεια σύνταξης, αλλά δεν θυμάμαι τι λάθος ήταν
Συγγνώμη για την άγνοια μου ... από πού γράφονται αυτοί οι κωδικοί; Από το τερματικό;
Οι κωδικοί αποτελούν μέρος του πηγαίου κώδικα. Δεν το βάζω πλήρες γιατί διαφορετικά η ανάρτηση είναι όλοι κωδικός και τίποτα δεν εξηγεί. Σας προτείνω να διαβάσετε τα σεμινάρια από την αρχή εάν θέλετε να το ακολουθήσετε. Μπορείτε επίσης να ελέγξετε τον πλήρη πηγαίο κώδικα εδώ (http://github.com/AdrianArroyoCalle/next-divel)
Πώς θα ήταν η βελτίωση έτσι ώστε να μην υπάρξει υπερχείλιση;
Kady, έχετε ελέγξει ακόμα τον κωδικό αποθετηρίου; Εκεί έχει καθοριστεί το μέγιστο μέγεθος, καθώς και λειτουργίες για τον έλεγχό του, εκεί μπορείτε να κάνετε την αλλαγή στο μέγεθος ή να εφαρμόσετε έναν λογικό τρόπο για να απελευθερώσετε το buffer όταν κορεστεί
Αφήνω τον σύνδεσμο για να τον ελέγξετε https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp
Γεια σας πολύ ενδιαφέρον, πρόκειται να συνεχίσετε με αυτή τη «σειρά» Emulating Linus Torvals;
Μπορείτε να συστήσετε οποιοδήποτε βιβλίο, πληροφορίες για να φτιάξετε έναν πυρήνα έτσι;
Χαιρετισμούς!
Γεια. Ευχαριστώ για το σεμινάριο. Παρακαλώ, μπορείτε να προτείνετε ένα βιβλίο σχετικά με αυτό που έχετε δημιουργήσει και δεν είναι "Λειτουργικά συστήματα" της Tanenbaum; Σας ευχαριστώ πολύ εκ των προτέρων.
Χαιρετισμούς.