Προσομοίωση Linus Torvalds: δημιουργήστε το δικό σας λειτουργικό σύστημα από το μηδέν (VIII)

Επιστρέφουμε στη σειρά μαθημάτων σχετικά με τον τρόπο δημιουργίας του δικού μας λειτουργικού συστήματος. Υποθέτω ότι θα σας αρέσει πολύ αυτό το κεφάλαιο, γιατί τελικά μπορούμε να αλληλεπιδράσουμε με το λειτουργικό μας σύστημα. Σήμερα θα διαβάσουμε την είσοδο πληκτρολογίου. Για αυτό, το σχήμα είναι παρόμοιο με αυτό του χρονοδιακόπτη. Πρέπει να χρησιμοποιήσουμε τα 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.

Προς το παρόν δεν λειτουργεί ως ξεχωριστό πρόγραμμα, αλλά ως λειτουργία που καλείται από τον πυρήνα, κυρίως επειδή δεν έχουμε προσθέσει ακόμη την επιλογή εκτέλεσης εκτελέσιμων. Και φυσικά, μερικές εικόνες για το πώς λειτουργεί το κέλυφος με τις νέες λειτουργίες εισαγωγής πληκτρολογίου.

NextShellLite


Αφήστε το σχόλιό σας

Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα υποχρεωτικά πεδία σημειώνονται με *

*

*

  1. Υπεύθυνος για τα δεδομένα: Miguel Ángel Gatón
  2. Σκοπός των δεδομένων: Έλεγχος SPAM, διαχείριση σχολίων.
  3. Νομιμοποίηση: Η συγκατάθεσή σας
  4. Κοινοποίηση των δεδομένων: Τα δεδομένα δεν θα κοινοποιούνται σε τρίτους, εκτός από νομική υποχρέωση.
  5. Αποθήκευση δεδομένων: Βάση δεδομένων που φιλοξενείται από τα δίκτυα Occentus (ΕΕ)
  6. Δικαιώματα: Ανά πάσα στιγμή μπορείτε να περιορίσετε, να ανακτήσετε και να διαγράψετε τις πληροφορίες σας.

  1.   Ντάρυο dijo

    εξαιρετικός δάσκαλος! ευχαριστώ 🙂

  2.   Ποπ Αρχ dijo

    Η αλήθεια είναι ότι δεν παρακολούθησα ποτέ το σεμινάριο γιατί στο πρώτο μέρος μου έδωσε ένα σφάλμα κατά την προσπάθεια σύνταξης, αλλά δεν θυμάμαι τι λάθος ήταν

  3.   Η γάτα του Λόπεζ dijo

    Συγγνώμη για την άγνοια μου ... από πού γράφονται αυτοί οι κωδικοί; Από το τερματικό;

    1.    AdrianArroyoStreet dijo

      Οι κωδικοί αποτελούν μέρος του πηγαίου κώδικα. Δεν το βάζω πλήρες γιατί διαφορετικά η ανάρτηση είναι όλοι κωδικός και τίποτα δεν εξηγεί. Σας προτείνω να διαβάσετε τα σεμινάρια από την αρχή εάν θέλετε να το ακολουθήσετε. Μπορείτε επίσης να ελέγξετε τον πλήρη πηγαίο κώδικα εδώ (http://github.com/AdrianArroyoCalle/next-divel)

  4.   Kady dijo

    Πώς θα ήταν η βελτίωση έτσι ώστε να μην υπάρξει υπερχείλιση;

    1.    Plock dijo

      Kady, έχετε ελέγξει ακόμα τον κωδικό αποθετηρίου; Εκεί έχει καθοριστεί το μέγιστο μέγεθος, καθώς και λειτουργίες για τον έλεγχό του, εκεί μπορείτε να κάνετε την αλλαγή στο μέγεθος ή να εφαρμόσετε έναν λογικό τρόπο για να απελευθερώσετε το buffer όταν κορεστεί
      Αφήνω τον σύνδεσμο για να τον ελέγξετε https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   nico dijo

    Γεια σας πολύ ενδιαφέρον, πρόκειται να συνεχίσετε με αυτή τη «σειρά» Emulating Linus Torvals;
    Μπορείτε να συστήσετε οποιοδήποτε βιβλίο, πληροφορίες για να φτιάξετε έναν πυρήνα έτσι;

    Χαιρετισμούς!

  6.   ΑπαντήσειςVeganas.Org dijo

    Γεια. Ευχαριστώ για το σεμινάριο. Παρακαλώ, μπορείτε να προτείνετε ένα βιβλίο σχετικά με αυτό που έχετε δημιουργήσει και δεν είναι "Λειτουργικά συστήματα" της Tanenbaum; Σας ευχαριστώ πολύ εκ των προτέρων.
    Χαιρετισμούς.