Micro-Empix
Από Κοινότητα Ελεύθερου Λογισμικού ΕΜΠ
Πίνακας περιεχομένων |
Micro-Empix Hacking από GNU/Linux
Το άρθρο αυτό εξηγεί πως μπορεί κανείς να χρησιμοποιήσει το εκπαιδευτικό λειτουργικό σύστημα Micro-Empix που παρέχεται στο μάθημα "Εργαστήριο Λειτουργικών Συστημάτων", μέσα από GNU/Linux, και δίνει συμβουλές για να γίνει ευκολότερη η ανάπτυξη κώδικα για τις σχετικές ασκήσεις. Όλα τα βοηθητικά προγράμματα που αναφέρονται είναι διαθέσιμα σε μια σύγχρονη διανομή GNU/Linux όπως Debian ή Ubuntu.
Προαπαιτούμενα
- DOSEMU
- VirtualBox
- GNU make
- GNU sed
- Κάποιος editor της επιλογής σας (π.χ. vim)
Φτιάχνουμε ένα κατάλογο εργασίας, έστω ~/micro. Εκεί μέσα τοποθετούμε το αρχείο micro.img από το micro_empix_disk_image.zip. Επιπλέον, εξάγουμε τον πηγαίο κώδικα του Micro-Empix, έστω στον κατάλογο src. Η επεξεργασία του κώδικα θα γίνεται στα αρχεία που βρίσκονται στον κατάλογο src, π.χ. ~/micro/src/Micro/micro.c, και έπειτα αυτά θα μεταγλωττίζονται και θα αντιγράφονται στο image file.
mkdir -p ~/micro/mnt cd ~/micro wget http://www.cslab.ece.ntua.gr/moodle/OSlab/micro_empix_disk_image.zip wget http://www.cslab.ece.ntua.gr/moodle/OSlab/microEmpixSources.zip unzip microEmpixSources.zip "Micro/*" "tc/*" -d src unzip -j micro_empix_disk_image.zip "New Folder (3)/micro.img"
Φτιάχνουμε μια κατάλληλη καταχώρηση στο /etc/fstab, για να προσαρτάται αυτόματα το image file:
/home/<user>/micro/micro.img /home/<user>/micro/mnt vfat loop,noauto,user,uid=<user>,gid=<user>,utf8,fmask=0133,dmask=0022 0 0
όπου αντικαθιστούμε το <user> με το πραγματικό όνομα χρήστη μας.
Επεξεργαζόμαστε κατάλληλα τα αρχεία env.bat και compile.bat στο src/Micro, ώστε να λειτουργούν με το image file, και αφαιρούμε τις αναφορές στο φάκελο Examples/.
sed -i 's/a:/../g' src/Micro/env.bat sed -i 's/..\\examples;//g' src/Micro/env.bat sed -i '1 {s/^/call env.bat\r\n/}' src/Micro/compile.bat sed -i '/examples/d' src/Micro/compile.bat
Eπεξεργαζόμαστε επίσης το micro.c, ώστε να αφαιρέσουμε τον κώδικα που δημιουργεί τα user processes P1 και P2 (μπορούμε να τα προσθέσουμε αργότερα, όταν θα γράψουμε τον δικό μας κώδικα), και αν θέλουμε αλλάζουμε το encoding από ISO-8859-7 σε UTF8 (με iconv -f iso8859-7 -t ut8).
sed -i '/Initializer/d; /extern void P/d; /create(P/d' src/Micro/micro.c
Προαιρετικά, μπορούμε να επεξεργαστούμε το micro.img, ώστε να αφαιρέσουμε τους φακέλους που δεν χρειάζονται για να τρέξουμε το Micro-Empix.
mount /home/<user>/micro/micro.img cd /home/<user>/micro/mnt/ cp Micro/micro.exe . rm -rf Micro/ Examples/ tc/ autoexec.bat cd .. umount mnt
Τέλος δημιουργούμε ένα Makefile, για τη μεταγλώττιση και αντιγραφή των κατάλληλων αρχείων στο micro.img:
.PHONY: clean distclean copy MNT = ../../mnt IMG = ../../micro.img DOS = dosemu -E FILES := micro # Add your own files here. OBJS := $(addsuffix .obj, $(FILES)) cswitch.obj MAP := micro.map EXE := micro.exe TARGETS := $(EXE) $(OBJS) all: $(TARGETS) %.exe: %.c %.h $(DOS) compile.bat %.obj: %.c %.h $(DOS) compile.bat %.obj: %.c $(DOS) compile.bat copy: $(TARGETS) mount $(IMG) cp $(EXE) $(MNT)/ umount $(MNT) clean: $(RM) $(OBJS) distclean: clean $(RM) $(EXE) $(MAP)
Σε περίπτωση που χρειαζόμαστε παραπάνω αρχεία, απλά τα προσθέτουμε στη μεταβλητή FILES, και επιπλέον τροποποιούμε το compile.bat κατάλληλα, ώστε να φροντίζει για τη μεταγλώττιση τους, και το σύνδεσή τους (linking) με τον κώδικα του Micro-Empix.
Για να μεταγλωττίσουμε τον κώδικα, εκτελούμε απλά make από τον κατάλογο src/Micro. Για να αντιγράψουμε τα αρχεία, εκτελούμε make copy. Αν θέλουμε η αντιγραφή να γίνεται κατευθείαν, απλά αντικαθιστούμε το all: $(TARGETS) με all: copy.
Ρύθμιση VirtualBox
Σημείωση: Οι οδηγίες είναι για VirtualBox 2.2.x και ενδέχεται να χρειάζεται διαφορετική διαδικασία σε άλλες εκδόσεις.
Η προετοιμασία του VirtualBox για τη δοκιμή του Micro-Empix είναι σχετικά απλή. Δημιουργούμε δύο εικονικά συστήματα, ένα με Windows XP που θα τρέχει τον εξομοιωτή μάζας, και ένα που θα τρέχει το Micro-Empix. Το 1ο περιγράφεται αναλυτικότερα σε άλλο οδηγό και δε θα επεκταθούμε.
Για το Micro-Empix φτιάχνουμε μια νέα εικονική μηχανή, με λειτουργικό σύστημα Other και έκδοση DOS. Αφήνουμε την προεπιλογή των 32 MB για τη RAM, και παραλείπουμε το σκληρό δίσκο, αφού δε θα μας χρειαστεί. Έπειτα πάμε στις ρυθμίσεις της νέας μηχανής, και στο Floppy επιλέγουμε το Image File του Micro-Empix, δηλαδή το micro.img.
Τέλος, από τις ρυθμίσεις της σειριακής θύρας επιλέγουμε το Port 1 -> Enable serial port, Port Mode -> Host Pipe, και ορίζουμε και το path για το pipe, π.χ. στο /tmp/serial1.
Κατόπιν, βάζουμε τις ίδιες ακριβώς ρυθμίσεις για τη σειριακή στη μηχανή που θα τρέχει Windows XP, με τη διαφορά ότι εδώ επιλέγουμε και το Create Pipe.
Τέλος, αφού ξεκινήσουμε τα Windows από το VirtualBox, προσθέτουμε την σειριακή θύρα, πηγαίνοντας στο Control Panel -> Add new hardware.
Εκτέλεση
Ανοίγουμε το VirtualBox, και ξεκινάμε τις δύο εικονικές μηχανές. Φροντίζουμε να ξεκινάμε πρώτα αυτή με τα Windows, ώστε να δημιουργεί το pipe. Στη μηχανή με τα Windows XP εκτελούμε το MassSimulator.exe, αφού το κάνουμε extract σε ένα φάκελο μαζί με το glut32.dll. Από τις ρυθμίσεις απο-επιλέγουμε τη Λειτουργία αποσφαλμάτωσης, και πατάμε Εκτέλεση. Στη μηχανή του Micro-Empix πληκτρολογούμε την εντολή micro για να ξεκινήσει το Micro-Empix.
Happy Hacking!
Προβλήματα/Troubleshooting
Ο linker δεν βρίσκει τις συναρτήσεις μου
Είναι πιθανό να φταίνε οι χαρακτήρες αλλαγής γραμμής. Αν και ο tcc θα κάνει compile ένα τέτοιο αρχείο χωρίς προβλήματα, δεν θα δουλέψει σωστά μετά ο linker.
Μπορούμε να μετατρέψουμε τους χαρακτήρες αλλαγής γραμμής από unix σε dos με ένα πρόγραμμα σαν το recode ή το tofrodos, ή με ένα sed script:
recode data..crlf myfile.c
ή
sed -i 's/$/\r/' myfile.c
Το make τερματίζει πρόωρα με Segmentation fault
Ενδεχομένως να μη δουλεύει σωστά το DOSEMU σε πυρήνες 2.6.29x, 32-bit με το bigmem extension. Δοκιμάστε κάποιον παλιότερο, π.χ. 2.6.26x.
Το make copy τερματίζει με μήνυμα λάθους
Αν βλέπεται το ακόλουθο μήνυμα:
... umount: it seems /home/<user>/micro/mnt is mounted multiple times make: *** [copy] Error 2
σημαίνει ότι για κάποιο λόγο δεν έγινε umount σωστά το image file. Κάντε το umount ως root, όσες φορές χρειαστεί, και επαναλάβετε.
