EMPIX

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

The Hitchhiker's Guide to EMPIX

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


Εγκατάσταση

Κατεβάστε το συμπιεσμένο αρχείο που περιέχει το EMPIX από το σύνδεσμο http://www.cslab.ece.ntua.gr/moodle/OSlab/EMPIX.rar και κάντε το extract:

$ unrar x EMPIX.rar

Θα δημιουργήσουμε έναν κατάλογο εργασίας, έστω work, με τους εξής υποκαταλόγους:

  • bin, περιέχει τα εργαλεία μεταγλώττισης
  • lib, περιέχει τις βιβλιοθήκες της Turbo C που χρησιμοποιούνται στη μεταγλώττιση
  • kernel, περιέχει τον πηγαίο κώδικα για τον πυρήνα του λειτουργικού
  • runtime, περιέχει τον πηγαίο κώδικα για την run-time library του λειτουργικού
  • apps, περιέχει τον πηγαίο κώδικα για τις εφαρμογές του λειτουργικού

και θα μεταφέρουμε εκεί τα αρχεία που χρειαζόμαστε, με το ακόλουθο script:

#!/bin/bash
# File: copy.sh

SOURCE="$1"
TARGET="$2"

fail() {
 echo "FATAL: $1"; exit 1;
}

[ -d "$SOURCE" ]   || fail "Invalid source dir '$SOURCE'"
mkdir -p "$TARGET" || fail "Could not create target '$TARGET'"

cp -r "$SOURCE/DEVELOPMENT/BIN" "$TARGET/bin"
cp -r "$SOURCE/DEVELOPMENT/LIB" "$TARGET/lib"
cp -r "$SOURCE/DEVELOPMENT/SRC" "$TARGET/kernel"
cp -r "$SOURCE/EMPIXFLOPPY/LIB" "$TARGET/runtime"
cp    "$SOURCE/EMPIXFLOPPYIMAGE.IMG" "$TARGET/empix.img"

mkdir -p "$TARGET/apps" "$TARGET/floppy"

cd "$TARGET" && rm -f lib/EMPIX.LIB runtime/EMPIX.LST runtime/PRINTF.ASM

που εκτελείται ως εξής (από το φάκελο όπου κάναμε extract):

./copy.sh EMPIXWBENCH work

Μετονομασία αρχείων (προαιρετικό)

Είναι αρκετά βολικό να μετονομάσουμε όλα τα αρχεία που μεταφέραμε σε πεζά, καθώς τα κεφαλαία είναι αντιαισθητικά και όχι ιδιαίτερα λειτουργικά. Αυτό μπορεί να γίνει με το ακόλουθο script:

#!/bin/bash
# File: rename.sh

TARGET="$1"
cd "$TARGET"
for dir in bin lib kernel runtime; do
    for file in $dir/*; do
        mv "$file" "`echo $file | tr [:upper:] [:lower:]`"
    done
done

που εκτελείται ως εξής:

./rename.sh work

Αλλαγή κωδικοποίησης (προαιρετικό)

Ακόμα βολικότερο είναι να μετατρέψουμε την κωδικοποίηση των αρχείων, από το obsolete codepage 737 (ελληνικά για DOS), ώστε να μπορούμε να διαβάσουμε τα σχόλια που περιλαμβάνουν ελληνικούς χαρακτήρες ευκολότερα (αρκετοί editors, όπως οι vim και kate, θα μπορέσουν να τα διαβάσουν και χωρίς αυτό, με κατάλληλες ρυθμίσεις):

#!/bin/bash
# File: recode.sh

TARGET="$1"
# Anything other than utf8, greek or cp1253 will most likely fail or produce garbage!
TARGETENC="${2-utf8}"

fail() {
    echo "$1"; exit 1;
}
warn() {
    echo -n "WARNING: Conversion of file '$1' from cp737 to '$TARGETENC' failed."
    echo -n " Make sure you provided a valid greek encoding (utf8, greek or cp1253)"
    echo " and that the file is actually encoded in cp737 (DOS Greek)."
}

TMPFILE=`mktemp _recode.XXXXXXXXXX` || fail "Could not get temporary file."
files="`find $TARGET -iname '*.[ch]' -or -iname '*.asm'`"

# This will still fail if we have filenames with white space (but we don't).
for file in $files; do
     { iconv -f cp737 -t "$TARGETENC" -o "$TMPFILE" "$file" \
       && cp "$TMPFILE" "$file"; } || warn "$file"
done
rm "$TMPFILE"

που εκτελείται ως εξής:

./recode.sh work

ή σε περίπτωση που προτιμάτε ISO-8859-7 από UTF8:

./recode.sh work greek

Συνοψίζοντας, τα 3 παραπάνω scripts μπορούν να εκτελεστούν όλα μαζί ως εξής:

./copy.sh EMPIXWBENCH work && ./rename.sh work && ./recode.sh work

Αυτόματη στοίχιση κώδικα (προαιρετικό)

Η στοίχιση στα αρχεία πηγαίου κώδικα του EMPIX δεν είναι η καλύτερη δυνατή. Μπορούμε να την μορφοποιήσουμε αυτόματα με κάποιο από τα προγράμματα indent ή astyle, ή με το ακόλουθο script για τον vim:

echo gg=G:wq > indent.vim
for file in `find -iname '*.[ch]'`; do
  vim -s indent.vim "$file"
done

Προσάρτηση των disk images

Για να μεταφέρετε τον πυρήνα του EMPIX και τις εφαρμογές του στο floppy disk image του λειτουργικού, πρέπει να προσθέσετε την ακόλουθη καταχώρηση στο /etc/fstab:

Για Debian/Ubuntu

/home/<user>/empix/empix.img /home/<user>/empix/floppy/ vfat loop=/dev/loop0,noauto,user 0 0

Για οποιοδήποτε distro

/dev/loop0 /home/<user>/empix/floppy vfat noauto,user 0 0

όπου αντί για <user> γράφετε το user name σας.

Διαχείριση

Για την καλύτερη διαχείριση του λειτουργικού δημιουργήστε τα ακόλουθα αρχεία:

  • Στο φάκελο kernel:
    • clean.sh
#!/bin/sh
rm *.exe *.obj inl.asm
    • install.sh

Για Debian/Ubuntu

#!/bin/sh
mount ../empix.img
cp empix.exe ../floppy
umount ../empix.img

Για οποιοδήποτε distro

(βεβαιωθείτε ότι το πακέτο util-linux που περιέχει το losetup είναι εγκατεστημένο)

#!/bin/sh
sudo losetup /dev/loop/0 ../empix.img
mount /dev/loop0
cp empix.exe ../floppy
umount /dev/loop0
sudo losetup -d /dev/loop/0
  • Στο φάκελο runtime:
    • make.bat
@..\bin\make
    • clean.sh
#!/bin/sh
rm *.obj *.lib far_ret.asm syscall.asm
    • makeobjs
+bssinit.obj+exit.obj+printf.obj+strcat.obj+strcmp.obj+strcpy.obj+&
strlen.obj+syscall.obj+far_ret.obj+..\lib\c0l.obj+..\lib\f_pcmp.obj+&
..\lib\h_ldiv.obj+..\lib\h_pada.obj+..\lib\h_pina.obj+&
..\lib\h_spush.obj+..\lib\f_lxmul.obj+..\lib\f_scopy.obj+&
..\lib\h_lrsh.obj+..\lib\h_padd.obj+..\lib\h_psbp.obj
    • Makefile
# Makefile for EMPIX run-time library

CC =..\bin\tcc.exe
ASM=..\bin\tasm.exe
LD =..\bin\tlink.exe
LIB=..\bin\tlib.exe

CCFLAGS=-c -mt
LDFLAGS=/c/x
ASMFLAGS=

all: empix.lib c0emp.obj

empix.lib: bssinit.obj exit.obj printf.obj strcat.obj strcmp.obj strcpy.obj strlen.obj syscall.obj far_ret.obj
	-del empix.lib
	$(LIB) $* @makeobjs
.c.obj:
	$(CC) $(CCFLAGS) $<

.asm.obj:
	$(ASM) $(ASMFLAGS) $*

c0emp.obj: c0emp.asm
bssinit.obj: bssinit.c
exit.obj: exit.c
far_ret.obj: far_ret.c
	 $(CC) -S $(CCFLAGS) far_ret.c
	 $(ASM) $(ASMFLAGS) $*
printf.obj: printf.c
strcat.obj: strcat.c
strcmp.obj: strcmp.c
strcpy.obj: strcpy.c
strlen.obj: strlen.c
syscall.obj: syscall.c syscall.h
	 $(CC) -S $(CCFLAGS) syscall.c
	 $(ASM) $(ASMFLAGS) $*
  • Στο φάκελο apps:
    • make.bat
@..\bin\make
    • clean.sh
#!/bin/sh
rm *.obj *.com
    • install.sh
#!/bin/sh
mount ../empix.img
cp *.com ../floppy
umount ../empix.img
    • Makefile
# Makefile for EMPIX applications

CC =..\bin\tcc.exe
ASM=..\bin\tasm.exe
LD =..\bin\tlink.exe
LIB=..\bin\tlib.exe

CCFLAGS=-c -mt -I..\include
LDFLAGS=/t
ASMFLAGS=

all: prog1.com

prog1.com: prog1.obj
	$(LD) $(LDFLAGS) ..\runtime\c0emp prog1.obj,prog1.com,nul,..\runtime\empix

.c.obj:
	$(CC) $(CCFLAGS) $<

prog1.obj: prog1.c
  • Στο φάκελο lib:
    • extract.bat
..\bin\tlib cl *H_LDIV*H_LRSH*F_LXMUL*H_PADA*H_PADD*F_PCMP*H_PINA*H_PSBP*F_SCOPY*H_SPUSH

Εκτέλεση

Εγκαταστήστε το DOSEMU, έναν εξοιμοιωτή που επιτρέπει την εκτέλεση εντολών DOS. Το συγκεκριμένο πρόγραμμα είναι απαραίτητο ώστε να γίνεται η μεταγλώττιση του EMPIX με τα εργαλεία που περιέχονται στο συμπιεσμένο αρχείο.

Πριν μεταγλωττίσετε εκ νέου τη run-time library του EMPIX πρέπει να εκτελέσετε τις παρακάτω εντολές:

cd lib
dosemu extract.bat

Οι παραπάνω εντολές ανακτούν μέσα από τη βιβλιοθήκη της Turbo C ορισμένα obj files, τα οποία πρέπει να ενσωματωθούν στη βιβλιοθήκη του EMPIX.

Εκτελέστε τις παρακάτω εντολές για τη μεταγλώττιση του EMPIX και των εφαρμογών του:

# μεταγλώττιση του πυρήνα
cd kernel
dosemu make.bat
./install.sh
cd ..
# μεταγλώττιση της run-time βιβλιοθήκης
cd runtime
dosemu make.bat
cd ..
# μεταγλώττιση των εφαρμογών
cd apps
dosemu make.bat
./install.sh
cd ..

Για την μεταγλώτισση των εφαρμογών, σε περίπτωση που χρησιμοποιήσετε directives του preprocessor της C(#define, #include κλπ), θα χρειαστεί να αντικαταστήσετε την αλλαγή γραμμής που χρησιμοοποιεί το Linux(\n), σε αυτή που χρησιμοποιεί το DOS(\r\n). Aυτό μπορεί να γίνει με τη βοήθεια του sed:

sed -i 's/$/\r/g'

Τέλος, μπορείτε να χρησιμοποιήσετε το πρόγραμμα VirtualBox για να εκκινήσετε μία εικονική μηχανή, η οποία θα κάνει boot μέσω του συγκεκριμένο floppy disk image. Στο command prompt του MS-DOS που εμφανίζεται μπορείτε να εκτελέσετε το αρχείο empix.exe οπότε να εκκινήσει το εκπαιδευτικό λειτουργικό σύστημα EMPIX.