Λειτουργικά Συστήματα (ΗΥ-345)
Χειμερινό Εξάμηνο 2009
Ασκηση 3η
Υλοποίηση System Calls στο ΜΙΝΙΧ
Σκοπός αυτής της άσκησης είναι εξοικείωση με τις έννοιες και την υλοποίηση των system calls σε ένα λειτουργικό σύστημα. Για το σκοπό αυτό σας ζητείται να φτιάξετε δύο νέα δικά σας system call στο λειτουργικό σύστημα Minix.
Περιγραφή
(1) Θα υλοποιήσετε ένα system call το οποίο θα επιστρέφει το process number που είναι αποθηκευμένο στο process table (mprog) του Memory Management system του minix για τη διεργασία που το κάλεσε. Το νέο αυτό system call θα το ονομάσετε getmslot().
(2) Κάθε διεργασία έχει ένα memory map entry για τα τρία διαφορετικά segments μνήμης που έχει (text, data και stack). To entry (mp_seg) αυτό είναι αποθηκευμένο στον process table (mprog) του Memory Management system και περιέχει τρεις τιμές για κάθε segment, τη εικονική διεύθυνση, τη φυσική διεύθυνση και το μέγεθος, που μας κάνουν συνολικά 9 τιμές.
Σας ζητείτε να υλοποιήσετε το system call getmmap(i) το οποίο ανάλογα με τη τιμή i που θα δέχεται ως όρισμα θα επιστρέφει μία από τις τιμές του memory map entry της διεργασίας που το κάλεσε ως εξής:
i = 0 εικονική διεύθυνση text segment
i = 1 φυσική διεύθυνση text segment
i = 2 μέγεθος text segment
i = 3 εικονική διεύθυνση data segment
i = 4 φυσική διεύθυνση data segment
i = 5 μέγεθος data segment
i = 6 εικονική διεύθυνση stack segment
i = 7 φυσική διεύθυνση stack segment
i = 8 μέγεθος stack segment
Για οποιαδήποτε άλλη τιμή του i η getmmap θα επιστρέφει -1
Παράδειγμα εξόδου
Τέλος θα γράψετε ένα απλό πρόγραμμα που θα χρησιμοποιεί αυτά τα δυο νέα system calls.
1) Process number of PID #33 is 9
Process number of PID #29 is 4
2)
int map[9];
for (i=0; i < 9; i++) map[i] = getmmap(i);
printf(“Text %d %d %d\n”, map[0], map[1], map[2]);
printf(“Data %d %d %d\n”, map[0], map[1], map[2]);
printf(“Stack %d %d %d\n”, map[0], map[1], map[2]);
Text 0 104 63
Data 0 167 20
Stack 60 227 2
Hints
- Στην άσκηση αυτή θα σας βοηθήσει πολύ η εντολή του UNIX
grep
. Επίσης, αν χρησιμοποιείτε τον vim
editor, θα σας φανεί πολύ χρήσιμο και το πρόγραμμα ctags
. Χρησιμοποιήστε την εντολή man
από το shell για να μάθετε πως ακριβώς λειτουργεί κάθε εντολή.
- Για δική σας ευκολία (για να ξέρετε σε ποιό σημείο έχετε αλλάξει κώδικα μέσα στα αρχεία του Μinix), χρησιμοποιείστε σχόλια πριν και μετά τις αλλαγές σας και/ή εντολές του τύπου :
#ifdef ... ή #if ...
... νέος κώδικας ...
#else
... παλιός κώδικας ...
#endif
- Για το πρώτο system call μπορείτε να ξεκινήσετε μελετώντας τον τρόπο λειτουργίας των system calls
getpid
και getppid
. Μερικά από τα αρχεία στα οποία ίσως χρειαστεί να επέμβετε ή ακόμα και να δημιουργήσετε οι ίδιοι είναι τα παρακάτω:
/src/lib/sunsyscall/Makefile
/src/lib/sunsyscall/getmslot.s
/src/lib/posix/Makefile
/src/lib/posix/_getmslot.c
/include/minix/callnr.h
/src/mm/table.c
/src/mm/getset.c
/include/minix/syslib.h
/src/lib/syslib/Makefile
/src/lib/syslib/sys_getmslot.c
/include/minix/com.h
/src/kernel/proc.h
/usr/src/kernel/system.c
Παρατηρήσεις
- Η άσκηση είναι ατομική. Τυχόν αντιγραφές μπορούν να ανιχνευθούν εύκολα από κατάλληλο πρόγραμμα και θα μηδενιστούν. Συμπεριλάβετε το όνομα σας, τον αριθμό μητρώου σας, και το username σας σε όλα τα αρχεία. Μην παραδώσετε εκτυπώσεις των προγραμμάτων.
- Γράψτε ένα αρχείο
README
, το πολύ 30 γραμμών, με επεξηγήσεις για τον τρόπο υλοποίησης των system calls.
- Κατασκευάστε ένα αρχείο Makefile, έτσι ώστε πληκτρολογώντας make all να γίνεται η μεταγλώττιση (compilation) του προγράμματος και να παράγονται τα εκτελέσιμα αρχεία. Επίσης πληκτρολογώντας make clean να καθαρίζονται όλα τα περιττά αρχεία, και να μένουν μόνο τα αρχεία που χρειάζονται για τη μεταγλώττιση.
- Κατασκευάστε τον κατάλογο assign3 που θα περιέχει όλα τα αρχεία που χρειάζονται για τη μεταγλώττιση της άσκησης 3. Παραδώστε το παραπάνω αρχείο χρησιμοποιώντας το πρόγραμμα submit (πληκτρολογήστε submit assignment_3@hy345 assign3 από τον κατάλογο που περιέχει τον assign3).
- Σε πολλές περιπτώσεις τα ονόματα των αρχείων είναι ενδεικτικά. Μπορείτε να χρησιμοποιήσετε όποια σας βολεύουν.