Παραθύρια. Εκκίνηση και τερματισμός.

Welcome!

By registering with us, you'll be able to discuss, share and private message with other members of our community.

SignUp Now!

grmadness

Death Knight
Approval of the Admiral
Joined
Apr 3, 2013
Messages
4,952
Δεν ξέρω τι να γράψω για πρόλογο.

Αλήθεια, έχετε σκεφτεί ποτέ τι συμβαίνει από την στιγμή που θα ξεκινήσετε το PC σας, μέχρι να είστε σε θέση να φορτώσετε το αγαπημένο σας FPS για να οργιάσετε στο fragfest; Μάλλον όχι. Επίσης, κάποια στιγμή όλοι μας έχουμε δεί το εκνευριστικό "Windows was not shut down<u> properly</u>", ή κάτι τέτοιο τεσπά. Τι μπορεί να σημαίνει αυτό; Αν δεν έχετε κάτι καλύτερο να κάνετε και διαθέτετε περιέργεια και λίγη υπομονή, θα τα δείτε παρακάτω.

Startup Process
Ξεκινάμε με κάτι που συμβαίνει πρίν.
Windows Boot Installation
Όλα αρχίζουν με την πρώτη εγκατάσταση των Windows, τα οποία περνάνε στον δίσκο (HDD/SSD) τον απαραίτητο κώδικα για την διαδικασία του boot, ώς κομμάτι του Setup τους.
Το boot process λοιπόν, διαφέρει από το startup process, το λέω για να μην μπερδεύεστε.
Στις μέρες μας, τα Windows έχουν δύο τρόπους για να "bootάρουν" το συστηματάκι μας, και το ποιός θα επιλεγεί εξαρτάται καθαρά από το hardware που διαθέτουμε. Αυτοί είναι

1. Bootάρισμα μέσω BIOS

Όλα ξεκινησανε μερικά (πολλά) χρόνια πίσω μάγκες, όταν το MS-DOS κυριαρχούσε. Από τότε δημιουργήθηκε μια νόρμα για τους x86, που καθορίζει το πως "χωρίζονται" οι συσκευές αποθήκευσης, γνωστή με το ελληνικότατο "Partitioning". Τι ακριβώς σημαίνει αυτό; Βοηθάει τα Windows να αναγνωρίζουν τις συσκευές αποθήκευσης.

Το Windows BIOS Boot λοιπόν μάγκες, αποτελείται από
α. το<b><span style="color:#00ff00"> Master Boot Record</span></b> (MBR) και
β. το <b><span style="color:#00ff00">System Volume</span></b> (aka Boot Partition). Περιέχει όοοοολο τον κώδικα εκκίνησης (boot) για το υπόλοιπο σύστημα.

Είπαμε ήδη πως όλα αρχίζουν από το Windows Setup, την πρώτη φορά που τα βάζουμε για εγκατάσταση. Και το πρώτο πράγμα που κάνουν είναι να φτιάξουν το MBR και να περάσουν τον κώδικα για το File System (Aπό τα Windows Vista και μετά, μόνο σε NTFS). Μετά, θα προετοιμάσουν τον δίσκο για εγκατάσταση, θα αντιγράψουν το αρχείο BOOTMGR, και θα ξεκινήσουν και το Boot Configuration Database (BCD), το οποίο αποθηκεύει τις πληροφορίες για όλα τα Λειτουργικά Συστήματα που είναι περασμένα στον δίσκο μας, και πως να ξεκινήσουμε σε αυτά. Χρησιμοποιείται από τον Windows Boot Manager για να μας δώσει το μενού επιλογής, ή να ξεκινήσει απευθείας στα Windows.

Πάμε και στο τι γίνεται αφού πατάμε το μαγικό κουμπάκι "Power"...
Το πρώτο κομματάκι κώδικα που εκτελείται είναι το BIOS (Basic Input Output System), το οποίο θα ψάξει για τους δίσκους που έχουν οριστεί σε αυτό, και θα ψάξει για το MBR. Αν δεν το βρεί, θα ψάξει για άλλους δίσκους, αν δεν υπάρχουν η διαδικασία σταματάει με ένα μήνυμα σφάλματος.
Αν το βρεί το MBR, θα το φορτώσει στην μνήμη, και αυτό θα αναλάβει δράση. Πως; Ψάχνει να βρεί το κομμάτι του δίσκου που έχει φτιαχτεί για το ξεκίνημα (Boot partition).
Το 'χουμε μέχρι εδώ; Ωραία, συνεχίζω. Το MBR δεν ψάχνει όπου κι όπου, έχει ενσωματωμένη βάση δεδομένων, πίνακα αν θέλετε, με τους τομείς του δίσκου που είναι φτιαγμένοι για Boot. Και τους βρίσκει από μια "σημαία", μια ένδειξη, που λέει πως ο συγκεκριμένος τομέας είναι ενεργός (active). Αφού τον βρεί λοιπόν, σειρά έχει η εκτέλεση του κώδικα στον τομέα εκκίνησης, κάτι που σημαίνει και κάτι ακόμα. Ανάγνωση του Windows Boot Manager (που βρίσκεται στην μνήμη) και μετά εκτέλεση.

Ο Windows Boot Manager (WBM) έχει μπόλικη δουλίτσα μπροστά του.
Το πρώτο πράγμα που θα κάνει, είναι να αλλάξει την λειτουργική κατάσταση του συστήματος σε προστατευμένη. Ακόμα δεν έχουμε ξεμπερδέψει με την χρήση του BIOS, το οποίο ψάχνει για συσκευή εξόδου εικόνας. Έπειτα, ο WBM δημιουργεί τις προυποθέσεις ώστε να μπορεί να χρησιμοποιήσει μνήμη κάτω από 16ΜΒ με το http://en.wikipedia.org/wiki/Paging" class="bbcode_url">paging ενεργοποιημένο, κάτι που κάνει αμέσως μετά (ενεργοποίηση paging), και τρέχει πλέον σε mode προστατευμένο με paging.
Το επόμενο βήμα του φιλαράκου μας είναι να πάει σπιούνικα να διαβάσει τι κρύβεται μέσα στο BCD. Το τι θα συμβεί έπειτα, εξαρτάται από το τι κοιμάται εκεί...

Αν επαναφέρετε το σύστημα από Hibernation, τότε ο WBM θα δώσει εντολή να εκτελεστεί το WINRESUME.EXE. Αυτό με την σειρά του, θα ψάξει να βρεί το HYBERFIL.SYS, μέσα στο οποίο έχει καταχωρηθεί η κατάσταση λειτουργίας του συστήματος, πρίν αυτό μπεί σε Hibernation.. Για να γίνει επαναφορά λοιπόν, το WINRESUME θα δώσει εντολή στον Kernel να ενεργοποιήσει το συγκεκριμένο "προφίλ" λειτουργίας.

Αν το σύστημα μόλις ξεκίνησε, ο WBM θα το παίξει ρουφιάνος, τσεκάροντας τον BCD για το τι λειτουργικά συστήματα έχουν εγκατασταθεί. Aν υπάρχουν από 2 και πάνω, θα δείτε μια οθόνη με μενού για επιλογή OS. Αν υπάρχει μόνο ένα, θα το φορτώσει παρακάμπτοντας το μενού. Στην περίπτωση μου, Windows, φορτώνει το WINLOAD.EXE

2. Bootάρισμα μέσω UEFI
Η μόνη διαφορά σε σχέση με τον Κθούλου που έγραψα παραπάνω, είναι η εξής.
Το Windows Setup περνάει τον κώδικα στην μνήμη και όχι στον δίσκο, συγκεκριμένα σε non-volatile RAM (που κρατάει τα δεδομένα ακόμα και μετά από κλείσιμο του συστήματος)
Επίσης, αλλάξτε τα .EXE σε .EFI. And that's pretty much it.

Τελειώσαμε. Ναί κύριοι. Με την εκκίνηση του συστήματος, όχι με το φόρτωμα των Windows. :spiteful:

Σειρά έχει ο Windows Boot Loader
o οποίος βρίσκεται μέσα στο WINLOADER.EXE
Ξεκινάμε παίδες. Αφού ξεμπερδέψαμε με την εκκίνηση του συστήματος, ο WBL αναλαμβάνει δράση φορτώνοντας αρχεία που βρίσκονται στον δίσκο, και είναι απαραίτητα για να ενεργοποιηθεί ο Kernel. Ας τα πάρουμε όμως με την σειρά, όπως και ο WBL άλλωστε...
Για αρχή, θα ψάξει για δύο πολύ συγκεκριμένα αρχεία. Το NTOSKRNL.EXE και το HAL.DLL. Αν για οποιονδήποτε λόγο δεν βρεί κάποιο από τα αρχεία αυτά, τότε χαμογελάστε παιδιά. "File is missing or corrupt", και μετά το όνομα του αρχείου... Επίσης, παράλληλα φορτώνονται και αρχεία που είναι άμεσα συνδεόμενα με αυτά τα δύο.
Έπειτα φορτώνεται το VGAOEM.FON. Αν λείπει, τα ίδια με παραπάνω.
Σειρά έχει η "κυψέλη" της Registry του συστήματος. Η οποία περιέχει όλες τις πληροφορίες που χρειάζεται ο WBM για να ξέρει ποιά device drivers πρέπει να φορτωθούν για σωστή εκκίνηση. Εδώ λοιπόν μάγκες είναι το χρονικό σημείο που δημιουργείται και μια λίστα με τους SERVICE_BOOT_START drivers. Δεν θα φορτωθούν ακόμα.
Σειρά παίρνει ο driver για το NTFS file system, που φορτώνεται πρίν από όλους. Ακούστε το γιατί. Aν δεν φορτωθεί πρώτος, όλοι οι άλλοι device drivers που φορτώνονται στην διαδικασία εκκίνησης θα πρέπει να φορτωθούν από μόνοι τους, κάτι φαινομενικά οκ, αλλά επειδή είναι απαραίτητοι για την σωστή διαδικασία εκκίνησης, απαιτείται ο driver για το file system πρώτα. Και έχουμε ένα παλαβό λούπ. Επανεκκινήσεις συνέχεια (loop) μετά από Win update γίνονται για αυτό τον λόγο. Θεά η MS, έτσι;
Αφού φορτωθεί το file system, σειρά για φόρτωμα έχουν οι boot time device drivers που σας είπα παραπάνω (φόρτωμα, όχι ενεργοποίηση τους, μην μπερδεύεστε).
Έχοντας ξεμπερδέψει με το φόρτωμα του NTOSKRNL.EXE, ο WBL εκτελεί την λειτουργία KiSystemStartup (κομμάτι του Kernel), δίνοντάς της έλεγχο. Αυτή αναλαμβάνει από εδώ και πέρα.

Και περνάμε στην ενεργοποίηση του KERNEL, η οποία μοιράζεται σε δύο φάσεις.

Φάση 0 (μηδέν)
Το πρώτο πράγμα που γίνεται εδώ, είναι απενεργοποίηση όλων των Events που μπορεί να υπάρξουν, για να γίνει ομαλά η διαδικασία. Το KiSystemStartup έχει κουβεντούλα με τον http://en.wikipedia.org/wiki/Hardware_Abstraction_Layer" class="bbcode_url">HAL (που έχει ήδη ενεργοποιηθεί) λέγοντας του "ξύπνα ότι CPU βρείς μπροστά σου".
Σημείωση. Σε συστήματα με περισσότερους CPU, ο CPU που αναφέρομαι είναι ο Boot CPU

Στα καπάκια, ο CPU θα φωνάξει την ρουτίνα KiInitializeKernel, η οποία εκτός από ωραία γκομενίτσα είναι και υπεύθυνη για την ενεργοποίηση του κώδικα του Kernel και των δεδομένων που μοιράζονται οι CPU του συστήματος.

Αφού γίνει η ενεργοποίηση του κώδικα του Kernel, ο CPU θα δώσει την σκυτάλη στην ρουτίνα InitBootProcessor. Παράλληλα, ο/οι άλλοι CPU του συστήματος (αν υπάρχουν) λέει στον HAL να ξυπνήσει και το υπόλοιπο σύστημα, ετοιμάζεται γλέντι.

Η ρουτίνα που είπαμε λοιπόν, αναλαμβάνει να κάνει τα εξής ωραία και κατανοητά.
Θα κόψει από την εντολή BURNMEMORY του BCD την πρόσβαση στην μνήμη, θα ενεργοποιήσει την μετάφραση για να καταλαβαίνονται μεταξύ τους τα κείμενα ANSI. OEM και Unicode. Αλλά δεν σταματάει εδώ η άτιμη ρουτίνα. Προετοιμάζει τον ελεγκτή του Kernel για τον κάθε CPU. Τέλος, θα ενεργοποιήσει τον μετρητή για το ρολόι του CPU. Αφού ξεμπερδέψει με αυτά, θα ξεκινήσει την εκτέλεση της φάσης 0, ενεργοποιώντας τα πλέον σημαντικά στοιχεία του Kernel, όπως το validation για την αυθεντικότητα των Windows.
Στην συνέχεια, ο διαχειριστής μνήμης θα ενεργοποιήσει το γνωστό σε όλους page file.
Η Ρουτινούλα όμως μας έχει φάει, και δεν τελείωσε ακόμα με τον Kernel. Συγκεκριμένα, αρχίζει την ενεργοποίηση των μανατζαρέων. Πάμε να τους δούμε με την σειρά.
α. Object manager. Υπεύθυνος για να μπορούν τα Windows να βλέπουν τα ονόματα όλων των αντικειμένων ώστε να μπορούν να έχουν πρόσβαση σε drivers, συσκευές, και να αναγνωρίζουν τους πόρους του συστήματος, φακέλους, και άλλα αντικείμενα.
β. Process manager. Αυτός ο μαλάκας είναι υπεύθυνος για την πρώτη διεργασία του συστήματος. System Idle Process.
γ. Plug n Pray manager. Ενεργοποιείται για να συντονίσει και να συγχρονίσει το Hardware καθώς και τους πόρους του συστήματος με τους πόρους του Hardware.

Αφού τελειώσει το meeting με τα golden boys, η ρουτίνα μας (InitBootProcessor) ενεργοποιεί τις δομές του Deferred Procedure Call http://en.wikipedia.org/wiki/Deferred_Procedure_Call" class="bbcode_url">(DPC), και δίνει τον έλεγχο στην System Idle Process, η οποία δημιουργεί ένα ειδικό νήμα μέσα στην System process για να ξεκινήσει η διαδικασία της Phase one.


<b><span style="color:#ffff00">Συνέχεια στο επόμενο πόστ.</span></b>
 
Kαι περνάμε στην Phase One. Χειροκρότημα.

Σε αυτή την φάση, ο κυρίως όγκος του Kernel ενεργοποιείται, και είναι το πιο χρονοβόρο κομμάτι της διαδικασίας του boot.
Για αρχή, όση μνήμη δεν χρειάζεται γίνεται διαθέσιμη και το νήμα που τρέχει την ενεργοποίηση της phase one θέτει τον εαυτό του στο υψηλότερο δυνατό priority.

Σε αυτό το χρονικό σημείο ο HAL προετοιμάζει το http://en.wikipedia.org/wiki/Interrupt_handler" class="bbcode_url">System Interrupt Handling για ενεργοποίηση. Μετά, συμβαίνουν τα εξής όμορφα.

1. Ξεκινάει ο driver που εμφανίζει την Boot screen (bootvid). Θεωρητικά, εμφανίζεται μια μαύρη οθόνη με μια loading bar, μα συνήθως γίνεται τόσο γρήγορα, που δεν την πιάνει το μάτι.
2. Ξεκινάει η ενεργοποίηση του διαχειριστή ενέργειας.
3. Αν υπάρχουν περισσότεροι από ένας επεξεργαστές, ενεργοποιούνται οι υπόλοιποι.
4. Ενεργοποίηση του http://en.wikipedia.org/wiki/Object_Manager_(Windows)" class="bbcode_url">Object Manager και του Kernel. Σε αυτό το σημείο ενεργοποιούνται συσκευές και drivers.
5. Ενεργοποίηση του http://en.wikipedia.org/wiki/Kernel_Scheduled_Entities" class="bbcode_url">Kernel Scheduler.

Διάλειμμα.
 
Εξαιρετικά. Χρόνου επιτρέποντος (και αν υπάρχει ενδαιφέρον) πιθανόν να γράψω κάτι για το πώς γίνεται το αντίστοιχο πράγμα σε linux σύστημα (και γιατί εμείς «οι από δώ» το κάνουμε καλύτερα)
 


headless wrote:
Εξαιρετικά. Χρόνου επιτρέπονταος (και αν υπάρχει ενδαιφέρον) πιθανόν να γράψω κάτι για το πώς γίνεται το αντίστοιχο πράγμα σε linux σύστημα (και γιατί εμείς «οι από δώ» το κάνουμε καλύτερα)</blockquote>

DO IT!!! PLEASE!!!
Aγορίνα σε ευχαριστώ, θα ήθελα να δώ και για Linux για το οποίο ομολογώ πως δεν ξέρω την τύφλα μου, και εννοείται πως παρατηρήσεις, διορθώσεις, κλπκλπ είναι πιο πάνω από δεκτά. :thumbsup:

 


headless wrote:
Εξαιρετικά. Χρόνου επιτρέποντος (και αν υπάρχει ενδαιφέρον) πιθανόν να γράψω κάτι για το πώς γίνεται το αντίστοιχο πράγμα σε linux σύστημα (και γιατί εμείς «οι από δώ» το κάνουμε καλύτερα)</blockquote>

πω πω φιλε! ανυπομονω!

 
Οπως συνήθως απολαυστικό και διδακτικό! Μερσί μεσιέ.
 
Thank you μεσιέ, έχει δουλίτσα μπόλικη, θα πάρει λίγες μέρες να το ολοκληρώσω, ψιλοτρεξιματάκια στο Real Life...
 
Back
Top