N
οσταλγείτε τις ένδοξες μέρες του Linux Coffee
HOWTO [1], τότε που οι Έλληνες geeks ήταν πραγμα-
τικοί geeks και έφτιαχναν τις δικές τους προγραμματι-
ζόμενες καφετιέρες; Θέλετε να ασχοληθείτε με hardware, αλ-
λά σας εκνευρίζουν τα κατσαβίδια, τα κολλητήρια και τα έξο-
δα για τα Board Support Packages; Θέλετε να μεγιστοποιήσε-
τε τον παραλληλισμό στην ανάπτυξη του software και του
hardware για ένα νέο περιφερειακό (αυτό που στη βιομηχανία
hardware αποκαλούν «shift left»); Θέλετε έναν εύκολο τρόπο
για να ανακαλύπτετε κενά ασφαλείας στην υποστήριξη «Plug
and Play» διαφόρων λειτουργικών, ώστε να αναπτύσσετε συ-
σκευές «Plug and Own»; Σε όλες αυτές τις περιπτώσεις (και
πολλές άλλες!) ο QEMU και τα εικονικά περιφερειακά του
αποτελούν τη λύση που ψάχνετε!
Αναμφίβολα, ο QEMU είναι ένα από τα πιο ενδιαφέροντα
προϊόντα που έχει να δείξει η κοινότητα του ΕΛΛΑΚ. Από το
πρώτο άρθρο του Fabrice Bellard στο USENIX το 2005 [2] μέ-
χρι το Linux-KVM, το Xen, το VirtualBox και τον emulator του
Android (goldfish), οι ιδέες (και ο κώδικας) του QEMU έχουν
διεισδύσει πραγματικά παντού και έχουν αλλάξει τον τρόπο
που αναπτύσσεται το λογισμικό συστήματος, αλλά και το
hardware στις μέρες μας, προς το (πολύ) καλύτερο. Δεν είναι
τυχαίο το ότι για κάποιο καιρό τουλάχιστον ο Fabrice φιγού-
ραρε ως το νούμερο 4 στο ρόστερ των Free Software
Hackers (μετά τον Stallman, τον Linus και το δημιουργό της
Perl, Lary Wall).
Εικονικά περιφερειακά στο QEMU
Τα τελευταία χρόνια η ανάπτυξη του QEMU υπήρξε ρα-
γδαία, όχι μόνο σε χαρακτηριστικά αλλά και προς την κατεύ-
θυνση της βελτίωσης της δομής και της ποιότητας του κώδι-
κα. Στις τελευταίες εκδόσεις, χάρη σε βελτιώσεις όπως το
εσωτερικό μητρώο συσκευών qdev [3], το QEMU Object
Model (QOM) κ.λπ., η συγγραφή εικονικών περιφερειακών
έχει απλοποιηθεί σημαντικά, με αποτέλεσμα να ανοίγονται νέ-
ες δυνατότητες χρήσης τους, όπως π.χ., rapid prototyping
[4], functional/security testing [5] κ.λπ.
Στο άρθρο αυτό θα φτιάξουμε το πρώτο μας εικονικό USB
περιφερειακό για τον QEMU, με ίσα-ίσα αρκετή λειτουργικό-
τητα, ώστε να μπορεί να φαίνεται στο lsusb εντός της εικονι-
κής μηχανής. Αυτό θα μας επιτρέψει να δούμε τη διαδικασία
ανάπτυξης αυτών των συσκευών στην πράξη, καθώς και να
μάθουμε τα βασικά για το πώς δουλεύουν τα περιφερειακά
του QEMU, οι USB descriptors και το αρχικό στάδιο του Plug
and Play των USB συσκευών.
USB descriptors
Ο Universal Serial Bus (USB) δεν χρειάζεται συστάσεις. Εί-
ναι ίσως η δημοφιλέστερη παγκοσμίως τεχνολογία διασύνδε-
σης περιφερειακών, με δισεκατομμύρια USB να κυκλοφο-
ρούν στην παγκόσμια αγορά. Ένα από τα σημαντικά χαρακτη-
ριστικά που επέτρεψαν αυτή την κυριαρχία είναι το λεγόμενο
«Plug and Play», δηλαδή η δυνατότητα να γίνεται η αρχικοποί-
ηση και παραμετροποίηση της συσκευής αυτόματα κατά τη
σύνδεση, με αποτέλεσμα να είναι κατευθείαν έτοιμη για χρή-
ση, χωρίς να απαιτείται κάποια ενέργεια από το χρήστη.
Για να μπορέσει αυτό να λειτουργήσει, διατηρώντας πα-
ράλληλα χαμηλά το κόστος των περιφερειακών, ο USB σχε-
διάστηκε ως ασύμμετρος (master-slave) δίαυλος, όπου όλη
την πολυπλοκότητα της αρχικής διαπραγμάτευσης
(handshake) και παραμετροποίησης (configuration) κάθε συ-
σκευής την αναλαμβάνει εξ ολοκλήρου ο υπολογιστής (host).
Η διαδικασία ονομάζεται απαρίθμηση (enumeration) και ξεκι-
νά αυτόματα με τη σύνδεση της συσκευής. Αν όλα πάνε καλά,
ο host αποδίδει στη συσκευή έναν αριθμό από 1-127, μέσω
του οποίου γίνεται στη συνέχεια η επικοινωνία με τη συσκευή.
Το μόνο που χρειάζεται να κάνουν τα περιφερειακά είναι να
μπορούν να περιγράψουν με ακρίβεια στο host τις λειτουρ-
γίες/δυνατότητες (π.χ., ποντίκι, πληκτρολόγιο, USB flash stick
κ.λπ.), αλλά και τις απαιτήσεις τους (π.χ., σε ρεύμα για bus
powered συσκευές).
Αυτό γίνεται στέλνοντας στο host δομές δεδομένων που
ονομάζονται περιγραφείς (descriptors), οι οποίοι μάλιστα εί-
ναι διαρθρωμένοι σε μία ιεραρχία
(εικόνα 1)
. Τα είδη των
descriptors έχουν ως εξής:
Device Descriptor:
Υπάρχει μόνο ένας ανά συσκευή και
περιλαμβάνει πληροφορία όπως το λεγόμενο USB ID
(VendorID:ProductID) της συσκευής, που την ξεχωρίζει από
Linux Inside
80
Ιεραρχία των descriptors μίας USB συσκευής.
1
Του Παντελή Κουκούσουλα <pktoss@gmail.com>
Linux Labs – QEMU
Σε αυτό το άρθρο κατασκευάζουμε το πρώτο μας
εικονικό USB περιφερειακό για τον QEMU,
μαθαίνοντας παράλληλα περισσότερα για τους USB
descriptors και το πώς δουλεύει το «Plug and
Play».
Εργαλεία:
Qemu
Δυσκολία:
URL:
goo.gl/P6Qlf
Τεκμηρίωση
QEMU
Εικονικά USB περιφερειακά με το QEMU!
Ο Παντελής ασχολείται με το Linux administration και τον προγραμματισμό.