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

Χειμερινό εξάμηνο 2010

Άσκηση 3η

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

Επίσης θα γράψετε δύο πολύ απλά προγράμματα που το καθένα θα χρησιμοποιεί ένα από τα παραπάνω system calls. Η έξοδος των προγραμμάτων αυτών θα μπορούσε να είναι:

> ./print_ancestors
Ancestors of process with PID 38: 37 <- 28 <- 1 <- 0
> ./get_procnum 33
Process number of PID #33 is 9

Στο readme που θα παραδώσετε θα πρέπει να περιγράψετε συνοπτικά τον τρόπο υλοποίησης των system calls και ενδεικτικά παραδείγματα εξόδου των προγραμμάτων. Περιγράψτε την ακολουθία των κλήσεων, τις συναρτήσεις βιβλιοθηκών και τα διάφορα τμήματα του λειτουργικού που εμπλέκονται κατά την εκτέλεση των system calls (τα βήματα που ακολουθούνται από την στιγμή που το σύστημα λαμβάνει το system call, πως το διαχειρίζεται εσωτερικά και πως επιστρέφει την απάντηση στον χρήστη).

Hints

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

Σημείωση

Επειδή πολλές φορές το ΜΙΝΙΧ μπορεί να μην τερματίζει κανονικά φροντίστε να σκοτώνετε τις διεργασίες που μένουν. Η εντολή ps -u $user θα σας δείξει όλες τις διεργασίες σας που τρέχουν στο συγκεκριμένο μηχάνημα. Αν κάποιες από αυτές αναφέρονται στην εντολή 'minix' τότε τερματίστε τις με την εντολή kill -9 pid_number όπου pid_number είναι το PID της διεργασίας που τρέχει το Minix. Για παράδειγμα:

> ps -u $user
PID TTY TIME CMD
3010 pts/15 0:01 tcsh
3855 pts/15 0:04 minix
3922 pts/17 0:01 tcsh
> kill -9 3855

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

  1. Η άσκηση είναι ατομική. Τυχόν αντιγραφές μπορούν να ανιχνευθούν εύκολα από κατάλληλο πρόγραμμα και θα μηδενιστούν. Συμπεριλάβετε το όνομα σας και το λογαριασμό σας (account) σε όλα τα αρχεία. Μην παραδώσετε εκτυπώσεις των προγραμμάτων.
  2. Κατασκευάστε ένα αρχείο Makefile, έτσι ώστε πληκτρολογόντας make all να γίνεται η μεταγλώττιση (compilation) του προγράμματος και να παράγεται το εκτελέσιμο αρχείο. Επίσης πληκτρολογόντας make clean να καθαρίζονται όλα τα περιττά αρχεία, και να μένουν μόνο τα αρχεία που χρειάζονται για τη μεταγλώττιση.
  3. Επιπλέον, γράψτε και ένα αρχείο readme.txt το πολυ 30 γραμμών που να περιέχει επεξηγήσεις για τον τρόπο υλοποίησης.