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

Καλώς ήλθατε σε μια άλλη ανάρτηση για πώς να δημιουργήσουμε το δικό μας λειτουργικό σύστημα (Προηγούμενα άρθρα στη σειρά: 1, 2, 3, 4, 5 y 6). Έχει περάσει πολύς καιρός από την τελευταία ανάρτηση, κυρίως λόγω ενός σφάλματος που βρήκα σε αυτό που έχουμε σήμερα. Θα δούμε πώς να χειριστείτε το ρολόι στις αρχιτεκτονικές x86.

Προηγουμένως είχαμε ενεργοποιήσει τα IRQ με γενικό τρόπο, αλλά υπήρχε ένα μικρό πρόβλημα, καθώς δεν τα ενεργοποιήσαμε σωστά και περάσαμε επιπλέον δεδομένα. Τελικά το επιδιορθώνουμε καρλοσόρτα και εγώ και εγώ μπορούμε να συνεχίσουμε να σχολιάζουμε πώς να συνεχίσω.

Λοιπόν, το ρολόι είναι ένα IRQ, ειδικά το πρώτο. Για να το διαμορφώσουμε, θα χρησιμοποιήσουμε τη συνάρτηση που ορίσαμε παραπάνω για να εγκαταστήσουμε γενικά τα IRQs, το ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0; void ND :: Timer :: Phase (int hz) {int divisor = 1193180 / hz; ND :: Θύρες :: ΈξοδοςB (0x43,0x36); ND :: Θύρες :: ΈξοδοςB (0x40, διαιρέτης & 0xFF); ND :: Θύρες :: ΈξοδοςB (0x40, διαιρέτης >> 8); } άκυρο ND :: Timer :: Wait (int ticks) {unsigned long eticks; eticks = ND_TIMER_TICKS + τσιμπούρια; ενώ (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Οθόνη :: PutString ("\ nΡύθμιση χρονοδιακόπτη ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Οθόνη :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Οθόνη :: PutString ("done"); } extern "C" άκυρο ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; εάν (ND_TIMER_TICKS% 18 == 0) {// ND :: Οθόνη :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Οθόνη :: PutString ("\ nΈνα άλλο δευτερόλεπτο"); ΠΡΕΠΕΙ ΝΑ ΚΑΝΟΥΜΕ ΑΝΑΦΟΡΑ ΟΘΟΝΗ}}

Ο κωδικός εκτελείται ως εξής: καλεί το σύστημα αρχικοποίησης ND :: Χρονοδιακόπτης :: Ρύθμιση, που καλεί ND_IRQ_Εγκαταστήστε το χειριστή για να εισαγάγετε στην πρώτη θέση, το IRQ0, μια συνάρτηση επανάκλησης όταν συμβαίνει το συμβάν, δηλαδή ND_Timer_Handler που αυξάνει το τσιμπούρια. Καθώς έχουμε ρυθμίσει την ταχύτητα του ρολογιού στα 18 Hz, όπως θα δούμε αργότερα, εάν το διαιρέσαμε με το 18 και μας δώσαμε έναν ακέραιο, ένα δευτερόλεπτο θα είχε περάσει.

Η λειτουργία ND :: Χρονόμετρο :: Φάση Μας βοηθά να ρυθμίσουμε την ταχύτητα του μετρών την ώραν, αυτός ο υπερβολικός αριθμός είναι 1.19 MHz που είναι μια κοινή τιμή. Λοιπόν, θα πρέπει να ονομάσουμε αυτήν τη λειτουργία εάν θέλουμε να αλλάξουμε την ταχύτητα του μετρών την ώραν, από προεπιλογή πηγαίνει στα 18,22 Hz, μια παράξενη τιμή στην οποία κάποιος πρέπει να έχει αποφασίσει IBM και παραμένει μέχρι σήμερα.

Η λειτουργία ND :: Χρονοδιακόπτης :: Περιμένετε είναι πολύ απλό, απλώς περιμένετε με ένα βρόχο ενώ μέχρι το τσιμπούρια απαραίτητο να συνεχίσει.

Στην εικόνα μπορούμε να δούμε ότι εάν αποσυναρμολογήσουμε τον κωδικό μέσα στο ND_Timer_Handler, έχουμε αυτό:

Δευτερόλεπτα στο NextDivel

Στο επόμενο κεφάλαιο θα δούμε πώς να διαβάζουμε το πληκτρολόγιο και να κάνουμε λίγο κέλυφος για να αλληλεπιδράσουμε με το σύστημά μας. Όπως πάντα, ο κωδικός είναι διαθέσιμο σε GitHub υπό την άδεια GNU GPL v2.


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

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

*

*

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

  1.   Νώε dijo

    Πολύ ενδιαφέρουσα σειρά μαθημάτων, προσωπικά δεν είχα δει πολλά για τη δημιουργία μιας διανομής Linux από το μηδέν, και ακόμη λιγότερο στα Ισπανικά και τόσο ολοκληρωμένα. Νομίζω ότι μπορείτε να μάθετε πολλά από αυτό και μόλις έχω χρόνο ελπίζω να μπορέσω να κάνω αυτά τα μαθήματα.
    Το μόνο που ζητώ είναι να μην αποθαρρύνεστε και να ολοκληρώσετε το σεμινάριο, καθώς έχω βρει πολλά καλά μαθήματα που δεν έχουν τελειώσει ποτέ.
    Χαιρετισμούς και ευχαριστίες :).

    1.    οδικός dijo

      Δεν είναι μια διανομή linux, είναι ένας πυρήνας 😛.

    2.    desikoder dijo

      Κάνετε λάθος. Η δημιουργία μιας διανομής linux δεν σημαίνει προγραμματισμό τίποτα, για παράδειγμα, σε ένα linux από το μηδέν δεν προγραμματίζετε, αυτό που κάνετε είναι να εγκαταστήσετε (με βάση τη μεταγλώττιση), βασικά πακέτα που αποτελούν μια διανομή. Αυτό είναι πολύ διαφορετικό. Δημιουργεί το δικό σας λειτουργικό σύστημα. Δεν έχει καμία σχέση με το linux. Αυτό έκανε το torvalds στην εποχή του εμπνευσμένο από το minix, και με αυτή τη θερμή και δημοφιλή συζήτηση μεταξύ torvalds και andrew s. tanenbaum σε μονολιθικό πυρήνα έναντι μικροπυρήνα.

      Saludos!

  2.   Ιλλκίκι dijo

    Ευχαριστώ. Μέχρι τώρα δεν έχω δώσει μεγάλη προσοχή στην ανάρτησή σας, αλλά είμαι σε ένα έργο, οπότε θα τους ρίξω μια ματιά.
    Χαιρετισμούς.

  3.   οδικός dijo

    Αξίζει να σημειωθεί ότι μπορούν να χρησιμοποιηθούν και άλλες γλώσσες, όπως Objective-C (++), C ++, D ή Rust.

    1.    AdrianArroyoStreet dijo

      Αυτό συμβαίνει στο C ++, όχι στο C. Ωστόσο, είναι δύσκολο να δούμε τις διαφορές, καθώς πολλοί χειριστές C ++ απαιτούν υποστήριξη βιβλιοθήκης, όπως οι νέοι και οι τελεστές διαγραφής. Θα ήταν πολύ ενδιαφέρον να φτιάξουμε ένα λειτουργικό σύστημα στο Rust. Υπάρχει στην πραγματικότητα ένα κανάλι IRC αφιερωμένο στα λειτουργικά συστήματα στο Rust (# rust-osdev στο irc.mozilla.net). Όποιος μεταγλωττιστεί στον κώδικα του μηχανήματος αξίζει πραγματικά, συμπεριλαμβανομένης της Java, εάν χρησιμοποιούμε GCJ.

      1.    οδικός dijo

        Ναι, πράγματι, το Rust είναι μια πολύ ενδιαφέρουσα γλώσσα για λειτουργικά συστήματα, επειδή δεν είναι μόνο πιο εύκολο να μάθει κανείς από το C ή το C ++ (συνεχίζει με συνεχείς αλλαγές, αλλά είναι πιο εύκολο), αλλά είναι πολύ πιο ασφαλές.

  4.   οδικός dijo

    Στη δεκαετία του '70 ήταν πολύ κοινό να προγραμματίζετε απευθείας στο υλικό, χωρίς λειτουργικό σύστημα.

  5.   Χριστόφορος dijo

    Εξαιρετικό ... τώρα πρέπει να καταλάβω: 3 ...

  6.   μμμ dijo

    Γεια. Σας ευχαριστώ πολύ για αυτά τα άρθρα. Αλλά, αν δεν έχω γνώσεις προγραμματισμού, δεν νομίζω ότι πρέπει να το κάνω, έτσι; Εννοώ, αν όχι θα ήταν "καλό, και τώρα τι αντιγράφω και επικολλάω;" ... τι κρίμα, πάντα ήθελα να ξέρω πώς να προγραμματίζω τόσο πολύ και τίποτα, είμαι περισσότερο γαϊδουράκι!

    1.    desikoder dijo

      Μην κατηγορείτε τον εαυτό σας, δεν είστε γάιδαρος. Καταρχάς, δεν γνωρίζουν όλοι οι προγραμματιστές πώς να γράφουν έναν πυρήνα, είναι μια πολύ απλή εργασία, και στην πράξη είναι μεγαλύτερη. Για παράδειγμα, εδώ ο συγγραφέας δημιουργεί γενικά προγράμματα οδήγησης για το πληκτρολόγιο και την οθόνη, χειρίζοντας τον πίνακα οθόνης, ο οποίος είναι μια μέθοδος που δεν χρησιμοποιείται καθόλου σήμερα. Το tty στο linux σήμερα είναι πολύ, πολύ περίπλοκο και δεν εξαρτάται από την αρχιτεκτονική x86 που διαθέτει μια διάταξη οθόνης. Επιπλέον, μεγάλο μέρος του κώδικα στο C εξαρτάται από την αρχιτεκτονική, όταν το ιδανικό είναι να φτιάξετε τον κώδικα αρχιτεκτονικής σε συναρμολογητή και ότι ο κώδικας C λειτουργεί σε οποιονδήποτε επεξεργαστή. Ωστόσο, δεν μειώνω τον συγγραφέα, επειδή ένας πυρήνας αποκτά τα χαρακτηριστικά που σήμερα θεωρούμε φυσιολογικά σε έναν πυρήνα linux, για παράδειγμα, δεν είναι εύκολη υπόθεση, και να είστε βέβαιοι ότι ένα άτομο δεν είναι απολύτως ανίκανο να το κάνει. Για κάτι, τα μεγάλα έργα, όπως linux, gcc, glibc, κ.λπ., δεν γίνονται από ένα άτομο, αλλά υπάρχουν πολλοί συνεργάτες.

      Επίσης, εάν θέλετε να ξεκινήσετε τον προγραμματισμό, έχετε αρκετούς οδηγούς στον Ιστό, αν και πρέπει να είστε προσεκτικοί και να επιλέξετε τους καλούς οδηγούς. Άρχισα να προγραμματίζω στο linux πηδώντας στην πισίνα με το κεφάλι μου και χωρίς νερό (δηλαδή, με την αγαπημένη γλώσσα C), αν και τώρα έχω κάποιες βασικές έννοιες του python (που είναι επίσης μια πολύ καλή γλώσσα). Υπάρχουν μερικά βιβλία C στα οποία παραιτείται από τη σελίδα 6 όσο περισσότερο από τον πονοκέφαλο παίρνετε, αλλά περισσότερο από βιβλία αυτά τα πράγματα αποκτώνται από την εμπειρία. Συμβαίνει όπως με το μοντέλο δικτύου OSI. Η τεκμηρίωση σχετικά με το μοντέλο osi είναι απολύτως αδύνατο να κατανοηθεί για τον νεοεισερχόμενο, αλλά εάν βρείτε έναν ιστότοπο με μια καλή εξήγηση των επιπέδων δικτύου, παίρνετε γρήγορα τις ιδέες για την αντιμετώπιση τεχνικών εγγράφων όπως τα RFC.

      Εν ολίγοις, ότι υπάρχουν καλοί ιστότοποι και εγχειρίδια εκεί έξω, είναι θέμα να φτάσετε σε αυτό και να βρείτε καλό υλικό.

      αφορά

  7.   Ελευθερία dijo

    Γεια σας, αφού προσπαθήσατε τόσο σκληρά για να επιλύσετε το "σφάλμα: δεν βρέθηκε κεφαλίδα multiboot." και «σφάλμα πρέπει πρώτα να φορτώσετε τον πυρήνα», καθώς δεν μπορούσα να βρω πουθενά τη λύση στο πρόβλημα του πρώτου άρθρου, το οποίο κάποιοι σαν κι εμένα είχα ... εδώ είναι η λύση, αν λειτουργεί για κάποιον ...

    Δεν ξέρω αν η θεωρία μου για την αιτία του σφάλματος είναι σωστή, αλλά ούτως ή άλλως, το ερώτημα είναι ότι κατά τη σύνταξη των αρχείων σε ένα λειτουργικό σύστημα 32-bit, δεν δημιούργησε το σφάλμα, αλλά επειδή έχω λειτουργικό 64-bit σύστημα (Gnu / Linux Debian 7), και ότι κατά τη σύνταξη και τον έλεγχο πήρα το σφάλμα "δεν βρέθηκε κεφαλίδα multiboot" και υπάρχει αμφιβολία, τότε κατά τη γνώμη μου το σφάλμα οφείλεται στο περιβάλλον ή την αρχιτεκτονική του λειτουργικού συστήματος στο οποίο συντάσσουμε τα αρχεία μας ... και αυτό που έκανα είναι να συντάξω τα αρχεία μου, καθορίζοντας το περιβάλλον ή την αρχιτεκτονική των 32 bit.
    * sudo ως -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -freestanding -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -freestanding
    Το περίεργο είναι ότι έχω κάποιες αμφιβολίες hahaha, τότε το λειτουργικό σύστημα που δημιουργούμε βήμα προς βήμα είναι για μια αρχιτεκτονική x86 ή κάνω λάθος ajajaj….

    PS: Κάποιος να με βοηθήσει με την αμφιβολία, και να συγχωρήσω κάποια ορθογραφικά λάθη ή την κακή μου έκφραση, και καλά δεν είμαι τέλειος, οπότε «Η τελειότητα έχει την τιμή του» .... Και το πιο σημαντικό, μιμηθείτε ένα λειτουργικό σύστημα 32-bit, ιερή λύση … .Χαχαχα

    1.    Μάρτιν Βίλμπα dijo

      Μεγαλοφυία! Ήθελα πραγματικά να κάνω αυτό το σεμινάριο και ξεκίνησα με αυτό το λάθος χαχα

  8.   Όσκαρ dijo

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

    αφορά