Εισαγωγή στον προγραμματισμό στον πυρήνα του Linux

Σχετικά έγγραφα
Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Οδηγός Ασύρματου Δικτύου Αισθητήρων στο Λειτουργικό Σύστημα Linux

Οδηγός Ασύρματου ικτύου Αισθητήρων στο Λειτουργικό Σύστημα Linux

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Δευτέρα 12:45-14:30 (Ν. κτ. Ηλεκτρ. Αμφ 1) Θεωρία Μαθήματος Παρουσίαση Εργαστηριακών Ασκήσεων

Διεργασίες και Νήματα (1/2)

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Εισαγωγή στα Λειτουργικά Συστήματα. Λειτουργικά Συστήματα 7ο εξάμηνο ΣΗΜΜΥ ακ. έτος

Διεργασίες και Νήματα (2/2)

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΟΡΓΑΝΩΣΗ Η/Υ

Εικονική Μνήμη (1/2)

Επιτεύγµατα των Λ.Σ.

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Διεργασίες - Σύνοψη. Διακοπές, προνομιούχος κατάσταση Κλήσεις συστήματος. Ορισμός, μεταβάσεις κατάστασης κύκλος ζωής

Εικονικοποίηση. Αρχιτεκτονική Υπολογιστών 5ο Εξάμηνο,

Εισαγωγή στο περιβάλλον προγραμματισμού του εργαστηρίου

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

Εισαγωγή στην Πληροφορική

Λειτουργικά Συστήματα. Εισαγωγή

HY150a Φροντιστήριο 3 24/11/2017

Κρυπτογραφική συσκευή VirtIO για QEMU-KVM

Λειτουργικά Συστήματα (ΗΥ321)

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Μνήμη Διευθύνσεις Δείκτες. Προγραμματισμός II 1

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Εργαστήριο Λειτουργικών Συστημάτων. Minix Overview

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Εισαγωγικά & Βασικές Έννοιες

Εργαστήριο Λειτουργικών Συστήματων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Εισαγωγή στην Πληροφορική

Σχεδίαση και Υλοποίηση Μηχανισμού Μεταφοράς Δεδομένων από Συσκευές Αποθήκευσης σε Δίκτυο Myrinet, Χωρίς τη Μεσολάβηση της Ιεραρχίας Μνήμης

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΕΙΣΑΓΩΓΗ

Εικονική Μνήμη (Virtual Μemory)

Κεφάλαιο 3.1: Λειτουργικά Συστήματα. Επιστήμη ΗΥ Κεφ. 3.1 Καραμαούνας Πολύκαρπος

Περιγραφή και Έλεγχος ιεργασιών

Υποστήριξη Λ.Σ. ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

Προηγμένοι Μικροεπεξεργαστές. Φροντιστήριο 4 Real Mode Interrupts

Λειτουργικά Συστήματα (διαχείριση επεξεργαστή, μνήμης και Ε/Ε)

Τι είναι ένα λειτουργικό σύστημα (ΛΣ); Μια άλλη απεικόνιση. Το Λειτουργικό Σύστημα ως μέρος του υπολογιστή

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Λιβανός Γιώργος Εξάμηνο 2017Β

Οδηγός Ασύρµατου ικτύου Αισθητήρων στο Λειτουργικό Σύστηµα Linux

Δίκτυα Επικοινωνιών ΙΙ: Network Programming UDP Sockets, Signals

Εισαγωγικά & Βασικές Έννοιες

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 4 - Editor

Εισαγωγή Χαρακτηριστικά του πυρήνα του Linux Ο ρόλος του λειτουργικού συστήματος...7

Εργαστήριο Λειτουργικών Συστημάτων. File Systems

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

ΗΜΥ Εργαστήριο Οργάνωσης Υπολογιστών και Μικροεπεξεργαστών

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

Ανάπτυξη και Σχεδίαση Λογισμικού

1. Εισαγωγή. Λειτουργικά Συστήματα Η/Υ. Διεργασίες. Ορισμός ΚΕΦΑΛΑΙΟ 3 - ΔΙΕΡΓΑΣΙΕΣ. Κεφάλαιο 3 «Διεργασίες»

Διαχείριση Κύριας Μνήμης

Παράλληλος Προγραμματισμός με OpenCL

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Προγραμματισμός Ταυτόχρονος Προγραμματισμός

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Λειτουργικά Συστήματα (Λ/Σ)

Οργάνωση ενός σύγχρονου Υπολογιστικού Συστήματος ή Ηλεκτρονικού Υπολογιστή (Η/Υ) Τα σύγχρονα συστήματα Η/Υ έχουν την παρακάτω οργάνωση:

Εικονική Μνήμη (Virtual Memory)

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Εικονική Μνήμη (Virtual Μemory)

Πληροφορική I. "Λογισμικό (Software)" B. Φερεντίνος

Ενότητα 3 - Θέματα Εφαρμοσμένης Επιστήμης Υπολογιστών. Κοντογιάννης Βασίλειος ΠΕ19

Εικονικοποίηση. Λειτουργικά Συστήματα Υπολογιστών 7ο Εξάμηνο,

Παράλληλη Επεξεργασία

Δομημένος Προγραμματισμός

File Management και I/O στο UNIX

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Μετατροπή χαρακτήρων ASCII σε αριθμό (atoi) & διάβασμα, και αποθήκευση του περιεχομένου του στη μνήμη. (Διάλεξη. Πανεπιστήμιο Κύπρου

Ε-85: Ειδικά Θέµατα Λογισµικού

Δείκτες σε συναρτήσεις. Προγραμματισμός II 1

Βασικές Έννοιες Πρ Ταο υγρ τόα χ μ ρ μ ο α ν τισμ ος Π ό ρ ςο ΙΙΙ γραμματισμός 1

2. Σκοποί και Λειτουργίες των ΛΣ. Λειτουργικά Συστήματα Η/Υ. Περίληψη. Ι. Προστασία Υλικού ΚΕΦΑΛΑΙΟ 2 - ΕΞΕΛΙΞΗ ΚΑΙ ΣΚΟΠΟΙ ΛΣ

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

Αρχιτεκτονική Υπολογιστών

Εργαστήριο Λειτουργικών Συστήματων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

Κύριες Υπηρεσίες ενός ΛΣ

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Δομές δεδομένων (2) Αλγόριθμοι

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

Αρχιτεκτονική Υπολογιστών

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκό Έτος

Writing kernels for fun and profit

Ενότητα 2 (Κεφάλαιο 3) Περιγραφή και Έλεγχος Διεργασιών. Περιεχόμενα. Ανάγκη ύπαρξης διεργασιών 1

Εισαγωγή στο περιβάλλον προγραμματισμού του εργαστηρίου

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr

Προγραμματισμός συστημάτων UNIX/POSIX

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Το λειτουργικό σύστημα. Προγραμματισμός II 1

ver Επεξεργαστές κειμένου, λογιστικών φύλλων, παρουσιάσεων Οδηγοί συσκευών (Device Drivers)

Λειτουργικά Συστήματα. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

Σκοπός Μαθήματος. Λειτουργικά Συστήματα Η/Υ. Γενικές Πληροφορίες. Στόχοι Μαθήματος ΚΕΦΑΛΑΙΟ 1 - ΕΙΣΑΓΩΓΗ. Θεωρία: Εργαστήριο: Κεφάλαιο 1 «Εισαγωγή»

Λειτουργικά Συστήματα Ι. Καθηγήτρια Παπαδάκη Αναστασία

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δείκτες και Συναρτήσεις (Κεφάλαιο 11, KNK-2ED)

Transcript:

Εισαγωγή στον προγραμματισμό στον πυρήνα του Linux Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, ΣΗΜΜΥ Εργαστήριο Υπολογιστικών Συστημάτων (CSLab) Μάρτιος 2016

Περίγραμμα παρουσίασης 1 Εισαγωγή 2 Χρήσιμα εργαλεία 3 Καταστάσεις χρήστη/πυρήνα 4 Process context/interrupt context 5 PCB task_struct 6 Διαχείριση μνήμης 7 Συγχρονισμός 8 Kernel vs user programming 9 Περιβάλλον ανάπτυξης (Qemu-KVM) 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Πυρήνας Linux http://wwwkernelorg I m doing a (free) operating system (just a hobby, won t be big and professional like gnu) for 386(486) AT clones Linus Torvalds 91 Τώρα: 191 MLOC Εκατοντάδες προγραμματιστές Τρέχει σε κινητά, αλλά και σε υπερ-υπολογιστές 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Οργάνωση κώδικα πυρήνα linux-26374/ arch/ drivers/ kernel/ mm/ fs/ net/ x86/ bluetooth/ forkc signalc fadvisec read-writec ext3/ ipv4/ bluetooth/ 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Πλοήγηση στον κώδικα του πυρήνα Παράδειγμα Yλοποίηση της κλήσης συστήματος: ssize_t read(int fd, void *buf, size_t count); Αρχείο fs/read_writec:407 SYSCALL_DEFINE3(read, unsigned int, fd, char user *, buf, size_t, count) 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Πλοήγηση στον κώδικα του πυρήνα Παράδειγμα Yλοποίηση της κλήσης συστήματος: ssize_t read(int fd, void *buf, size_t count); Αρχείο fs/read_writec:407 SYSCALL_DEFINE3(read, unsigned int, fd, char user *, buf, size_t, count) { struct file *file; ssize_t ret = -EBADF; 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Πλοήγηση στον κώδικα του πυρήνα Παράδειγμα Yλοποίηση της κλήσης συστήματος: ssize_t read(int fd, void *buf, size_t count); Αρχείο fs/read_writec:407 SYSCALL_DEFINE3(read, unsigned int, fd, char user *, buf, size_t, count) { struct file *file; ssize_t ret = -EBADF; int fput_needed; file = fget_light(fd, &fput_needed); if (file) { loff_t pos = file_pos_read(file); ret = vfs_read(file, buf, count, &pos); file_pos_write(file, pos); fput_light(file, fput_needed); } } return ret; 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Πλοήγηση στον κώδικα του πυρήνα Linux Cross Reference Χρήσιμο εργαλείο: http://lxrfree-electronscom Online browser του κώδικα του πυρήνα Κώδικας από διάφορες εκδόσεις του πυρήνα Εύκολη αναζήτηση στον κώδικα Διαχείριση και s/w projects εκτός από τον πυρήνα 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Χρήσιμα εργαλεία Κλήσεις συστήματος/σήματα strace Πληροφορίες για τις κλήσεις συστήματος που καλεί μια διεργασία και για τα σήματα που λαμβάνει Δυνατότητα να γίνουν trace και τα παιδιά της διεργασίας Παράδειγμα χρήσης user@utopia:~$ strace cat foo execve("/bin/cat", ["cat", "foo"], [/* 35 vars */]) = 0 open("foo", O_RDONLY) = 3 fstat(3, {st_mode=s_ifreg 0644, st_size=22, }) = 0 read(3, "I am an example file!\n", 4096) = 22 write(1, "I am an example file!\n", 22I am an example file! ) = 22 read(3, "", 4096) = 0 close(3) = 0 close(1) = 0 close(2) = 0 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Χρήσιμα Εργαλεία Στατιστικά συστήματος vmstat Χρήση μνήμης (active/inactive, buffers, cache, free, swap) Χρήση CPU (user/system times, idle, αναμονή για Ε/Ε) Χρήση δίσκων (αναγνώσεις/εγγραφές, τρέχουσες λειτουργίες Ε/Ε) Άλλα στατιστικά (caching αντικειμένων του πυρήνα, πλήθος forks) Παράδειγμα procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 0 741084 12712 189216 0 0 140 0 643 1133 3 2 91 4 1 1 0 737232 13656 190336 0 0 1732 0 1060 3216 8 5 57 30 2 1 0 736116 15080 190004 0 0 1456 0 1182 4584 18 10 25 47 0 1 0 737160 15244 190504 0 0 212 0 878 3185 24 5 63 9 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Κάταστασεις χρήστη/πυρήνα Μία διεργασία μπορεί να βρίσκεται σε δύο καταστάσεις: Κατάσταση χρήστη (user mode) Περιορισμένες δυνατότητες Κατάσταση πυρήνα (kernel mode) Πλήρης έλεγχος του συστήματος Ο πυρήνας δεν είναι διεργασία, αλλά κώδικας που εκτελείται σε kernel mode είτε εκ μέρους κάποιας διεργασίας χρήστη είτε ως απόκριση σε κάποιο hardware event 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Καταστάσεις χρήστη/πυρήνα Ροή εκτέλεσης κλήσης συστήματος Δ0 Δ1 Δ2 Εικονική Μνήμη Σύστημα Αρχείων Χρον/τής Διαχ Μνήμης Χρον/τής Ε/Ε KME Μνήμη Δίσκος 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Καταστάσεις χρήστη/πυρήνα Ροή εκτέλεσης κλήσης συστήματος Δ0 Δ1 Δ2 1 Kλήση συστήματος Εικονική 2 Έλεγχος ορισμάτων Μνήμη Σύστημα Αρχείων 4 Επιστροφή Χρον/τής Διαχ Μνήμης Χρον/τής Ε/Ε 3 Εκτέλεση KME Μνήμη Δίσκος 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Καταστάσεις χρήστη/πυρήνα Διαχωρισμός χώρων χρήστη/πυρήνα Το Linux είναι ένα σύγχρονο ΛΣ που χρησιμοποιεί εικονική μνήμη Δ0 Δ1 Δ2 Μνήμη Δίσκος 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Καταστάσεις χρήστη/πυρήνα Διαχωρισμός χώρων χρήστη/πυρήνα Ο εικονικός χώρος διευθύνσεων ενός μηχανήματος χωρίζεται σε δύο μέρη: Χώρος χρήστη (εφαρμογές και δεδομένα χρήστη) Χώρος πυρήνα (δεδομένα του πυρήνα) Μία διεργασία που τρέχει στον χώρο χρήστη έχει πρόσβαση μόνο στο χώρο χρήστη Μία διεργασία που τρέχει στον χώρο πυρήνα έχει απεριόριστη πρόσβαση σε όλο το σύστημα 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Καταστάσεις χρήστη/πυρήνα Διαχωρισμός χώρων χρήστη/πυρήνα Ο εικονικός χώρος διευθύνσεων ενός μηχανήματος χωρίζεται σε δύο μέρη: Χώρος χρήστη (εφαρμογές και δεδομένα χρήστη) Χώρος πυρήνα (δεδομένα του πυρήνα) Μία διεργασία που τρέχει στον χώρο χρήστη έχει πρόσβαση μόνο στο χώρο χρήστη Μία διεργασία που τρέχει στον χώρο πυρήνα έχει απεριόριστη πρόσβαση σε όλο το σύστημα Μεταφορά δεδομένων από/προς χώρο χρήστη copy_from_user: userspace kernelspace copy_to_user: kernelspace userspace 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Kernel contexts Ο πυρήνας μπορεί να εκτελείται 1 εκ μέρους κάποιας διεργασίας χρήστη (process context) 2 ως απόκριση σε κάποιο hardware event (interrupt context) 3 Υπάρχουν και kernel threads 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Σημεία εισόδου στον πυρήνα Κλήσεις συστήματος (system calls) Οδηγοί συσκευών (device drivers) Pseudo filesystem /proc 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Process Control Block task_struct Αρχείο include/linux/schedh:1182 struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; int prio, static_prio, normal_prio; unsigned int rt_priority; struct mm_struct *mm, *active_mm; pid_t pid; }; const struct cred rcu *cred; /* effective (overridable) subjective task * credentials (COW) */ /* open file information */ struct files_struct *files; 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Process Control Block task_struct Αρχείο include/linux/schedh:1182 struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; int prio, static_prio, normal_prio; unsigned int rt_priority; struct mm_struct *mm, *active_mm; pid_t pid; }; const struct cred rcu *cred; /* effective (overridable) subjective task * credentials (COW) */ /* open file information */ struct files_struct *files; 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Παράδειγμα: struct cred Locking Reference counting Copy-On-Write (COW) 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Παράδειγμα: struct cred Get include/linux/credh:224 /** * get_cred - Get a reference on a set of credentials * @cred: The credentials to reference * * Get a reference on the specified set of credentials The caller must * release the reference * */ static inline const struct cred *get_cred(const struct cred *cred) 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Παράδειγμα: struct cred Put include/linux/credh:244 /** * put_cred - Release a reference to a set of credentials * @cred: The credentials to release * * Release a reference to a set of credentials, deleting them when the last ref * is released * */ static inline void put_cred(const struct cred *_cred) 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Παράδειγμα: struct cred Prepare kernel/credc:269 /** * prepare_creds - Prepare a new set of credentials for modification * * Prepare a new set of task credentials for modification * A task's creds shouldn't generally be modified directly, therefore * this function is used to prepare a new copy, which the caller then * modifies and then commits by calling commit_creds() * * Preparation involves making a copy of the objective creds for * modification * * Returns a pointer to the new creds-to-be if successful, NULL otherwise * * Call commit_creds() or abort_creds() to clean up */ struct cred *prepare_creds(void) 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Διαχείριση μνήμης στον πυρήνα του Linux Σε χαμηλό επίπεδο Βασική μονάδα διαχείρισης της φυσικής μνήμης, η σελίδα (page_struct) Ζώνες μνήμης (DMA, Highmem, Normal) Διαχείριση σελίδων φυσικής μνήμης: alloc_pages, get_free_pages, free_pages Συνεχόμενες σελίδες φυσικής μνήμης 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Διαχείριση μνήμης στον πυρήνα του Linux Σε υψηλότερο επίπεδο kmalloc (πόσα bytes θέλουμε + flags) Συνεχόμενες σελίδες φυσικής μνήμης Μηχανισμοί caching (Slab) vmalloc (σαν την γνωστή userspace malloc) Συνεχόμενες σελίδες εικονικής μνήμης Αποδέσμευση μνήμης: kfree, vfree 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

slabinfo cat /proc/slabinfo ext2_inode ext2_xattr ext3_inode ext3_xattr tcp_bind_bucket blkdev_requests inode_cache size-4096(dma) size-4096 size-2048(dma) size-2048 size-1024(dma) 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Γιατί χρειάζεται συγχρονισμός; Πολυεπεξεργασία (συστήματα μοιραζόμενης μνήμης) Ασύγχρονες διακοπές Διακοπτός πυρήνας (preemptible kernel) Επομένως, πρόσβαση σε μοιραζόμενες δομές πρέπει να προστατεύεται με κάποιο είδος κλειδώματος 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Μηχανισμοί συγχρονισμού στον πυρήνα Μερικοί από τους μηχανισμούς συγχρονισμού που υλοποιούνται στο χώρο πυρήνα είναι οι εξής: Ατομικές εντολές (Atomic Operations) Interface: atomic_read(), atomic_set(), Περιστροφικά Κλειδώματα (Spinlocks) Interface: spin_unlock(), spin_lock(), spin_unlock_irqrestore(), spin_lock_irqsave(), Σημαφόροι (Semaphores) Interface: down(), down_interruptible(), up(), 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Kernel vs user programming Μικρή στατική στοίβα (προσοχή στις τοπικές μεταβλητές) Δεν μπορούμε να χρησιμοποιούμε πράξεις κινητής υποδιαστολής Δεν μπορούμε να χρησιμοποιήσουμε την libc Στον πυρήνα παρ όλα αυτά υλοποιούνται πολλές συναρτήσεις με interface παρόμοιο με των συναρτήσεων της libc, πχ, printk() kmalloc() kfree() 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Kernel vs user programming (2) ΠΡΟΣΟΧΗ: Δεν βρισκόμαστε πλέον στον προστατευμένο χώρο χρήστη Παράδειγμα: αποδεικτοδότηση δείκτη σε NULL Στο χώρο χρήστη: Segmentation Fault Στον πυρήνα: Kernel Oops 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Περιβάλλον ανάπτυξης (Qemu-KVM) Για τη διαδικασία ανάπτυξης κώδικα στον πυρήνα δε χρειάζονται αυξημένα δικαιώματα, αλλά εγκατάσταση ενός νέου πυρήνα στο σύστημα και φόρτωση ενός νέου module μπορεί να κάνει μόνο ο χρήστης root Πώς δοκιμάζουμε ένα νέο πυρήνα με ασφάλεια; Με χρήση εικονικής μηχανής, που θα «τρέχει» τον νέο πυρήνα στο χώρο χρήστη Το qemu (Quick EMUlator) είναι ένας emulator που προσωμοιώνει τη λειτουργία ενός πραγματικού υπολογιστή Το KVM είναι ένα σύνολο από modules του πυρήνα που επιτρέπουν στο χρήστη να εκμεταλλευτεί τις επεκτάσεις των σύγχρονων επεξεργαστών για virtualization 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Qemu-KVM Virtualization Linux Guest Windows Guest Διεργασία 1 Διεργασία 2 Διεργασία 1 Διεργασία 2 userspace kernelspace system calls userspace kernelspace Win32 / Win64 Πυρήνας Linux Πυρήνας Windows Υλικό (Virtual Machine) Υλικό (Virtual Machine) Άλλες διεργασίες Διεργασία QEMU Διεργασία QEMU userspace kernelspace system calls Πυρήνας Linux KVM Module (kvm_intel, kvm_amd) Υλικό CPU Virtualization Extensions Σχήμα: Αρχιτεκτονική του Qemu-KVM 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Χρήση του Qemu-KVM Βοηθητικά αρχεία: utopiash: εκκινεί την εικονική μηχανή utopiaconfig: απαραίτητες ρυθμίσεις QEMU_BUILD_DIR Ο φάκελος στον οποίο έχει εγκατασταθεί το qemu ROOTFS_FILE Το root filesystem που θα χρησιμοποιήσει η εικονική μηχανή Πιο αναλυτικές οδηγίες στον οδηγό που δίνεται στο site του μαθήματος 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Βιβλιογραφία Linux Kernel Development, Robert Love, Novell Press, 2005 Linux Device Drivers, Jonathan Corbet, Alessandro Rubin, Greg Kroah-Hartman, O Reilly Media, 3rd Edition, 2005, http://lwnnet/kernel/ldd3/ Understanding the Linux kernel, Daniel Bovet, Marco Cesati, O Reilly Media, 3rd edition, 2005 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358

Ευχαριστούμε Λίστα μαθήματος: os-lab@listscslabecentuagr 03 / 2016 Linux Kernel Programming ΣΗΜΜΥ, 34358