Σκοπός της άσκησης αυτής είναι η μελέτη της λειτουργίας ενός system call. Για το σκοπό αυτό θα προσθέσετε δύο νέα system calls στο λειτουργικό σύστημα Minix.
prapid
(print ancestors
PIDs). To system call αυτό θα τυπώνει στην έξοδο (stdout) μία λίστα με
το PID της τρέχουσας διεργασίας, το PID της πατρικής της τρέχουσας διεργασίας,
το PID της πατρικής της πατρικής της τρέχουσας διεργασίας, κοκ.getpnr
. Το
system call αυτό θα δέχεται ως παράμετρο ένα process ID (PID) και θα
επιστρέφει το process number που είναι αποθηκευμένο στον process table
του πυρήνα και αντιστοιχεί στη διεργασία με το συγκεκριμένο PID.Επίσης θα γράψετε δύο πολύ απλά προγράμματα που το καθένα θα χρησιμοποιεί ένα από τα παραπάνω 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, πως το διαχειρίζεται εσωτερικά και πως επιστρέφει την απάντηση στον χρήστη).
grep
.
Επίσης, αν χρησιμοποιείτε τον vim
editor θα
σας φανεί πολύ χρήσιμο και το πρόγραμμα ctags
. Χρησιμοποιήστε
την εντολή man
από το shell για να μάθετε
πως ακριβώς λειτουργεί κάθε εντολή.#ifdef ... ή #if ...
... νέος κώδικας ...
#else
... παλιός κώδικας ...
#endif
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