HY-345 Λειτουργικά Συστήματα


ΑΣΚΗΣΗ 3η

Φθινόπωρο 2008

 

Υλοποίηση System Calls στο ΜΙΝΙΧ

Σκοπός αυτής της άσκησης είναι εξοικείωση με τις έννοιες και την υλοποίηση των system calls σε ένα λειτουργικό σύστημα. Για το σκοπό αυτό σας ζητείται να φτιάξετε δύο νέα δικά σας system call στο λειτουργικό σύστημα Minix.

Θα υλοποιήσετε ένα
system call το οποίο θα δέχεται σαν παράμετρο ένα process ID (PID) και θα επιστρέφει το process number που είναι αποθηκευμένο στο process table του kernel. Το νέο αυτό system call θα το ονομάσετε getpnr().

Επίσης θα προσθέσετε ένα
system call το οποίο θα εμφανίζει τις εγγραφές του process table. Θα εμφανίζεται μόνο τα slots τα οποία δεν είναι άδεια. Υπάρχουν αρκετά παραδείγματα μέσα στον κώδικα του MINIX που να διατρέχουν τον process table. Για κάθε διεργασία του process table θα πρέπει να εμφανίζεται το pid, το process number και το όνομα της διεργασίας. Παρακάτω σας δίνεται ένα παράδειγμα για το πως μπορεί να είναι το output της κλήσης αυτού του system call. Το system call αυτό θα το ονομάσετε prproct().

Τέλος θα γράψετε ένα απλό πρόγραμμα που θα χρησιμοποιεί αυτά τα δυο νέα
system calls.

Η έξοδος του προγράμματος μπορεί να είναι η εξής:
PID   P_NR    P_NAME
0
       -10          TTY
0
      -9            DP8390
0
      -8            SYN_AL
0
      -7            IDLE
...

29      4            sh
18      5            update
30      6            getty
30      7            getty
30      8            getty
33      9            project5

Process number of PID #33 is 9 Process number of PID #29 is 4

Hints

  1. Στην άσκηση αυτή θα σας βοηθήσει πολύ η εντολή του UNIX grep. Επίσης, αν χρησιμοποιείτε τον vim editor, θα σας φανεί πολύ χρήσιμο και το πρόγραμμα ctags. Χρησιμοποιήστε την εντολή man από το shell για να μάθετε πως ακριβώς λειτουργεί κάθε εντολή.
  2. Για δική σας ευκολία (για να ξέρετε σε ποιό σημείο έχετε αλλάξει κώδικα μέσα στα αρχεία του Μinix), χρησιμοποιείστε σχόλια πριν και μετά τις αλλαγές σας και/ή εντολές του τύπου :
    #ifdef ... ή #if ...
    ... νέος κώδικας ...
    #else
    ... παλιός κώδικας ...
    #endif
  3. Για το πρώτο system call μπορείτε να ξεκινήσετε μελετώντας τον τρόπο λειτουργίας των system calls getpid και getppid. Μερικά από τα αρχεία στα οποία ίσως χρειαστεί να επέμβετε ή ακόμα και να δημιουργήσετε οι ίδιοι είναι τα παρακάτω:
    /src/lib/sunsyscall/Makefile
    /
    src/lib/sunsyscall/getpnr.s
    /
    src/lib/posix/Makefile
    /
    src/lib/posix/_getpnr.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_getpnr.c
    /
    include/minix/com.h
    /
    src/kernel/proc.h
    /
    src/kernel/system.c


Παρατηρήσεις:

  1. Η άσκηση είναι ατομική. Τυχόν αντιγραφές μπορούν να ανιχνευθούν εύκολα από κατάλληλο πρόγραμμα και θα μηδενιστούν. Συμπεριλάβετε το όνομα σας και το λογαριασμό σας (account) σε όλα τα αρχεία.
  2. Γράψτε ένα αρχείο README, το πολύ 30 γραμμών, με επεξηγήσεις για τον τρόπο υλοποίησης των system calls.
  3.  Κατασκευάστε το αρχείο assign3.tar.gz που θα περιέχει τo README και το αρχείο minix.img, το οποίο είναι το image του minix που φορτώνεται από το bochs. Xρησιμοποιείστε την εντολή tar και για συμπίεση το πρόγραμμα gzip). Παραδώστε το παραπάνω αρχείο χρησιμοποιώντας το πρόγραμμα submit (πληκτρολογήστε ~hy345/bin/submit 3 από το directory που περιέχει το αρχείο assign3.tar.gz).
  4. Σε πολλές περιπτώσεις τα ονόματα των αρχείων είναι ενδεικτικά. Μπορείτε να χρησιμοποιήσετε όποια σας βολεύουν.