Micro-Empix

Από Κοινότητα Ελεύθερου Λογισμικού ΕΜΠ
Μετάβαση σε: πλοήγηση, αναζήτηση

Micro-Empix Hacking από GNU/Linux

Το άρθρο αυτό εξηγεί πως μπορεί κανείς να χρησιμοποιήσει το εκπαιδευτικό λειτουργικό σύστημα Micro-Empix που παρέχεται στο μάθημα "Εργαστήριο Λειτουργικών Συστημάτων", μέσα από GNU/Linux, και δίνει συμβουλές για να γίνει ευκολότερη η ανάπτυξη κώδικα για τις σχετικές ασκήσεις. Όλα τα βοηθητικά προγράμματα που αναφέρονται είναι διαθέσιμα σε μια σύγχρονη διανομή GNU/Linux όπως Debian ή Ubuntu.

Προαπαιτούμενα

Φτιάχνουμε ένα κατάλογο εργασίας, έστω ~/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, όσες φορές χρειαστεί, και επαναλάβετε.