Προηγμένοι Μικροεπεξεργαστές Paging & Segmentation
Segmentation Τεχνική για σπάσουμε την μνήμη σε λογικά κομμάτια Κάθε κομμάτι αποθηκεύει πληροφορία σχετική με data segments for each process code segments for each process data segments for the OS etc. Στόχος: (όπως και του paging) χρήση σκληρού δίσκου για να φαίνεται μεγαλύτερη η μνήμη Το Segmentation μπορεί να υλοποιηθεί με και χωρίς paging
Segmentation P 1 data P 1 code print function P 2 data P 2 code OS Code OS data OS stack logical address space
Addressing Segments Αρχικά υποθέτουμε ότι ΔΕΝ υπάρχει paging στο σύστημα Η CPU στέλνει logical addresses Τα logical addresses αποτελούνται από segment number και ένα offset μέσα στο segment Segment number: index σε ένα table Table περιέχει το physical address της αρχής του segment (base address) Offset + base address physical address Offset, limit checking
Addressing Segments limit base S o logical address segment table o < limit yes + Physical Address no error
Segmentation Hardware Θεωρητικά ίδιο με το paging Όμως segments έχουν μεταβλητό μέγεθος Όλα γίνονται σε hardware Πολλά γίνονται από το OS ή από system software (όπως λέει το manual)
Protection and Sharing limit base 0 1000 200 1 35009000 LDT limit base 0 1000 200 1 300 2000 LDT limit base 0 500 2500 1 9000 20000 GDT 200 1200 2000 2300 2500 3000 9000 12500
Segment Registers (i386)
Segmentation Issues Αν δεν είχαμε paging Όλο το segment είναι είτε στην memory ή στο δίσκο Μεταβλητού μεγέθους segments external fragmentation στην μνήμη Πρέπει να βρεθεί μεγάλος χώρος για ένα νέο segment Ίσως να χρειαστούν πολλά segments να βγουν από την μνήμη για να μπει ένα νέο segment
Segmentation with Paging Όλα αυτά λύνονται με το paging
Logical to Physical Address Translation in Pentium
virtual address from user descriptor offset limit base + segment table linear address PT directory directory page offset page table page frame directory base
Γιατί paging; Paging και segmentation είναι ισοδύναμοι μηχανισμοί virtual memory Γιατί χρειαζόμαστε άλλο ένα σύστημα virtual memory;
Γιατί paging: Intel's part Το segmentation αρχικά υλοποιήθηκε μόνο για την επέκταση της μνήμης πάνω από τα 64KB virtual memory και protection = afterthought μπήκαν στους 80286 Η διαχείριση ενός segmented μοντέλου στους x86 είναι δύσκολη Ποτέ δεν υποστηρίχθηκε πλήρως από τα OS
Γιατί paging: Pros and cons Στο segmentation η διεργασία παίρνει ακριβώς το χώρο που χρειάζεται, όχι το πολλαπλάσιο κάποιας τιμής --------------------------------------------------------------------------- Διαφορετικά μεγέθη segments = εξωτερικό fragmentation και δυσκολία διαχείρισης Για να δεσμεύσουμε ένα segment για καινούργια δεδομένα σε μία πλήρη μνήμη θα διώξουμε έναν τυχαίο αριθμό από segments τυχαίων μεγεθών Επικαλυπτόμενα segments: Δύσκολο να διακρίνουμε ποιος χώρος ανήκει σε ποιο segment
Γιατί paging: Pros and cons Το segmentation μας δίνει ισχυρούς μηχανισμούς protection και multitasking ευκολίες --------------------------------------------------------------------- Περίπλοκοι και συνήθως αχρείαστοι Με paging και system software μπορούμε σχετικά εύκολα και συχνά πιο αποδοτικά να υλοποιήσουμε παρόμοιες λειτουργικότητες
Paging: Γενικά Το (linear/virtual) address space χωρίζεται σε ισομεγέθη blocks συνεχόμενων θέσεων μνήμης, τα pages Κάθε linear/virtual διεύθυνση μεταφράζεται σε physical μέσω ενός page table To page table δείχνει την φυσική διεύθυνση όπου ξεκινά το page Η linear διεύθυνση επιλέγει page & offset μέσα στο page Ο συνδυασμός της φυσικής διεύθυνσης βάσης και του offset δημιουργεί την τελική φυσική διεύθυνση
Paging: Γενικά Το λειτουργικό σύστημα μπορεί να σημαδεύει εγγραφές στο page table σαν κενές Το page που αντιστοιχεί σε μία τέτοια εγγραφή μπορεί τότε να μετακινηθεί εκτός μνήμης, πχ στον δίσκο Αν ένα πρόγραμμα προσπαθήσει να προσπελάσει ένα τέτοιο page, παράγεται page fault, ο έλεγχος γυρνά στο λειτουργικό, αυτό επαναφέρει την σελίδα στην μνήμη και συνεχίζεται κανονικά η προσπέλαση
Virtual Memory: Γενική ιδέα Εικονική Μνήμη Μεγαλύτερη από τη Φυσική Μνήμη
Paging στους x86 Τα pages έχουν μέγεθος 4KB (ή 4ΜΒ) και είναι στοιχισμένα σε όρια των 4 KB Η φυσική μνήμη αποτελείται από 1Μ pages Η μετάφραση από linear σε physical γίνεται σε δύο επίπεδα Το πρώτο επίπεδο επιλέγει page table To δεύτερο επιλέγει ένα page από το page table
Paging στους x86
Paging στους x86
Paging στους x86 Ο καταχωρητής CR3 περιέχει την διεύθυνση βάσης του page directory Τα 10 υψηλότερα bits της linear διεύθυνσης δίνουν τον αύξων αριθμό του entry μέσα στο page directory (page directory entry) To page directory entry είναι 32 bit και δίνει την διεύθυνση βάσης του αντίστοιχου page table και πληροφορίες για το OS
Paging στους x86 Τα 10 επόμενα bits της linear διεύθυνσης δίνουν τον αύξων αριθμό του entry μέσα στο επιλεγμένο page table (page table entry) To page table entry είναι 32 bit και δίνει την φυσική διεύθυνση βάσης ενός page (page frame address)
Paging στους x86 Τα τελευταία 12 bits της linear διεύθυνσης δίνουν το offset του δεδομένου μέσα στο page frame
Page table entries Τα page table entries και τα page directory entries έχουν την ίδια δομή Τα 20 υψηλότερα bits δίνουν την διεύθυνση βάσης του page frame που θα χρησιμοποιηθεί από το επόμενο επίπεδο μετάφρασης
Page table entries Τα υπόλοιπα bits χρησιμοποιούνται από τον επεξεργαστή για διαχείριση και προστασία Present: αν είναι 0, προκαλείται page fault ώστε το λειτουργικό να φέρει την σελίδα στην μνήμη Read/Write: ορίζει τα δικαιώματα ανάγνωσης/εγγραφής του αντίστοιχου page frame User/Supervisor: ορίζει το απαιτούμενο CPL για χρήση του page frame Accessed: Γίνεται set όταν προσπελαστεί το page frame Dirty: Γίνεται set όταν γίνει προσπέλαση εγγραφής στο page frame
Elegant Paging Τo page directory και τα page tables έχουν 1Κ εγγραφές των 4 byte Κάθε directory και table είναι στο δικό page Μπορούμε να μετακινούμε ολόκληρα page tables όπως τα υπόλοιπα pages, ακόμη και να τα βγάζουμε εκτός μνήμης
Πέρασμα σε paging Δημιουργία page table entries τα page frames που χρησιμοποιούνται από τον κώδικα πρέπει να αντιστοιχούν σε pages με ταυτόσημες linear διευθύνσεις. linear address == physical address Φόρτωση του CR3 (PDBR) με την διεύθυνση βάσης του page directory Set το PG bit του CR0 Jump για να αδειάσει το pipeline
Segmentation + Paging??? Το segmentation δεν μπορεί να απενεργοποιηθεί τελείως, ακόμη και αν χρησιμοποιούμε paging
Intel Pentium Segmentation
Pentium Paging Architecture
Intel 386 address translation 34
Segmentation + Paging??? Διάφορες λογικές χρήσης: Segment που περιέχουν πολλαπλά pages, για ξεχωριστή προστασία μεγάλων δομών Pages που περιέχουν πολλαπλά segments, για προστασία και διαχωρισμό κρίσιμων μικρών δομών από τις γειτονικές Segments που ταυτίζονται με τα pages, ώστε να αυξάνουμε την προστασία των σελίδων χωρίς να περιπλέκουμε την διαχείρηση μνήμης
Segmentation + Paging??? Στην πράξη όμως: Flat memory model: οι segment registers δείχνουν σε segments που ξεκινούν από την διεύθυνση 0 και καλύπτουν όλη την μνήμη Πχ από το linux 2.6 υπάρχουν μόνο 5 descriptors: Null Code και data με DPL = 0 Code και data με DPL = 3
Linear Address in Linux Υπάρχουν 4 μέρη:
Three-level Paging in Linux
Intel 386 address translation 39
Segment Registers (i386)
Translation Lookaside Buffers Κανονικά η μετάφραση απαιτεί δύο έξτρα προσπελάσεις μνήμης Η καθυστέρηση προσπέλασης της μνήμης ούτως ή άλλως είναι bottleneck στους σύγχρονους επεξεργαστές Και τώρα την τριπλασιάζουμε;;;;
Translation Lookaside Buffers Τα περισσότερα προγράμματα κάθε χρονική στιγμή χρησιμοποιούν μόνο ένα μικρό υποσύνολο των σελίδων τους Translation Lookaside Buffers (TLB): μικρές και γρήγορες κρυφές μνήμες μέσα στον επεξεργαστή κρατάνε αντιστοιχίες για τις πιο πρόσφατες μεταφράσεις από linear σε physical address Αν το πρόγραμμα έχει τοπικότητα στην χρήση των δεδομένων του, το virtual memory είναι δωρεάν!
Πως γίνεται η μετάφραση Τα bits 31:22 μας δείχνουν το offset του σχετικού directory entry μέσα στο Page Directory Τα bits 21:12 μας δείχνουν το offset του σχετικού page-table entry μέσα στο Page Table. Τα bits 11:0 μας δείχνουν το offset της μεταβλητής μέσα στο Page 3 memory accesses για την προσπέλαση μίας μεταβλητής Προφανώς δεν γίνεται να κάνουμε την ίδια διαδικασία για κάθε ξεχωριστή μεταβλητή
Translation Lookaside Buffer Η Λύση: Μία cache μνήμη που θα αποθηκεύει αντιστοιχίες virtual σε physical διευθύνσεις TLB Κάθε εγγραφή του TLB περιέχει: Τα 20 high-order bits της virtual address Τα 20 high-order bits της αντίστοιχης physical address 4 control bits Για pages που η physical address τους βρίσκεται στο TLB Μόνο ένα access
TLB και x86 architecture Η δομή και οι μέθοδοι ελέγχου του TLB δεν αποτελούν κομμάτι της x86 αρχιτεκτονικής Σε κάθε διαφορετικό μοντέλο η υλοποίηση μπορεί και συνήθως είναι αρκετά διαφορετική
TLB και x86 architecture
Test Registers Έλεγχος των TLB
Έλεγχος των TLB Τα περιεχόμενα των TLB είναι προσπελάσιμα μέσω των test registers TR6 και TR7 TR7 TR6
TR6: Έλεγχος των TLB TR6 Bit 0: Δηλώνει αν θέλουμε να αναζητήσουμε (1) ή να γράψουμε (0) ένα TLB Bit 1: Δηλώνει αν θέλουμε να ενεργήσουμε στο instruction (0) ή στο data (1) TLB Bits 31:12 : Το page που ψάχνουμε να δούμε αν περιέχεται στο TLB ή που θέλουμε να προσθέσουμε TR7 TR6
TR7: Έλεγχος των TLB TR7 Bit 4: Δείχνει αν κατά την αναζήτηση ενός page είχαμε hit στο TLB Bits 31:12 : Αν αναζητούσαμε και είχαμε hit περιέχουν την physical address που αντιστοιχεί στο page που αναζητήσαμε Αν γράφουμε ένα TLB θέτουμε εδώ το physical address που θέλουμε να αντιστοιχεί στο page που ορίσαμε στον TR6 TR7 TR6
Έλεγχος των TLB Μετά τους Pentium οι TR6 και TR7 μετατράπηκαν σε Model Specific Registers που διαβάζονται με την εντολή RDMSR και γράφονται με την εντολή WRMSR RDMSR: Διαβάζει τον MSR που καθορίζεται από τον ECX στους καταχωρητές EDX:EAX WRMSR: Γράφει τα περιεχόμενα των καταχωρητών EDX:EAX στον MSR που καθορίζεται από τον ΕCX Ο TR6 χρησιμοποιείται με ECX=8 και ο TR7 με ECX=9
Παράδειγμα ελέγχου του D-TLB next: mov eax,page_no ;load eax with the page number or eax,01h ;we search for that page or eax,02h ;and we search in the D-TLB mov ecx,08h ;WRMSR refers to TR6 wrmsr ;so TR6 <= eax mov ecx,09h ;RDMSR refers to TR7 rdmsr ;so eax <= TR7 and al,10h ;leave only the hit bit jz miss ;if zero, page not in TLB hit: ;print that page PAGE_NO was found and ;to which physical page frame it corresponds miss: ;print that page PAGE_NO was not found