X.systems.press ist eine praxisorientierte Reihe zur Entwicklung und Administration von Betriebssystemen, Netzwerken und Datenbanken. Christoph Czernohous

Pervasive

Basistechnologien, Softwareentwicklung, Werkzeuge

123 Christoph Czernohous Silcherplatz 5 71106 Magstadt Deutschland [email protected]

ISSN 1611-8618 ISBN 978-3-540-20940-9 e-ISBN 978-3-540-68426-8 DOI 10.1007/978-3-540-68426-8 Springer Heidelberg Dordrecht London New York

Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.

c Springer-Verlag Berlin Heidelberg 2012 Dieses Werk ist urheberrechtlich geschützt. Die dadurch begründeten Rechte, insbesondere die der Übersetzung, des Nachdrucks, des Vortrags, der Entnahme von Abbildungen und Tabellen, der Funksendung, der Mikroverfilmung oder der Vervielfältigung auf anderen Wegen und der Speicherung in Datenverarbeitungsanlagen, bleiben, auch bei nur auszugsweiser Verwertung, vorbehalten. Eine Vervielfältigung dieses Werkes oder von Teilen dieses Werkes ist auch im Einzelfall nur in den Grenzen der gesetzlichen Bestimmungen des Urheberrechtsgesetzes der Bundesrepublik Deutschland vom 9. September 1965 in der jeweils geltenden Fassung zulässig. Sie ist grundsätzlich vergütungspflichtig. Zuwiderhandlungen unterliegen den Strafbestimmungen des Urheberrechtsgesetzes. Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Werk berechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne der Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürften.

Einbandentwurf: KünkelLopka GmbH, Heidelberg

Gedruckt auf säurefreiem Papier

Springer ist Teil der Fachverlagsgruppe Springer Science+Business Media (www.springer.com) Für Bettina Vorwort

Pervasive hei§t auf Deutsch so viel wie durchdringend, allgegenwärtig, sich überall ausbreitend. Und genau das geschieht zur Zeit mit der Rechenleistung von Compu- tern aller Art. Es gibt kaum noch technische Alltagsgegenstände, die nicht irgend- eine Form von Mikroprozessor beinhalten, die diese Geräte steuern und zusätzliche Funktionalität bereitstellen, von der Waschmaschine über das Auto zum Mobiltele- fon. Wir werden jeden Tag fast überall von Rechenleistung umgeben, sie ist all- gegenwärtig und durchdringt unser Leben, auch wenn wir es manchmal gar nicht merken. Zur gleichen Zeit gibt es einen weiteren Trend mit starkem Wachstumspotenzial: Open Source. Die Verbreitung von Software, deren Quellen für jedermann einsehbar sind, hat in den letzten Jahren stark zugenommen, allem voran das offene Betriebs- system Linux. Ausgehend von einem Betriebssystem für Personal Computer, hat sich Linux in der Zwischenzeit ein festes Standbein im Server-Umfeld geschaffen und wird auch in eingebetteten Systemen, der Grundlage für Pervasive Computing, immer beliebter. Der Kombination dieser beiden Wachstumsperspektiven, Pervasive Computing und Linux, gilt das vorliegende Buch. Es richtet sich an Produkt- und Software- entwickler, die Linux in eingebetteten Systemen einsetzen möchten, setzt dabei aber Grundkenntnisse über die Benutzung und Administration von Linux, sowie Programmierkenntnisse voraus. Auch die Vor- und Nachteile von Open Source im allgemeinen und Linux im besonderen werden nicht erörtert. Dieses Buch nähert sich dem Thema Pervasive Linux von der Anwendungs- bzw. Softwareentwick- lungsseite. Es geht hauptsächlich darum, den Einstieg in die Entwicklung für Perva- sive Linux zu erleichtern. Angesichts der Vielfalt an verfügbarer Hard- und Soft- ware in diesem Bereich sei für das vertiefende Studium einzelner Themen auf die jeweils spezialisierte Literatur verwiesen. Nicht Gegenstand des Buches ist die Portierung von Linux selbst auf zusätzliche Hardware-Plattformen. Aus den selben Gründen werden auch nicht sämtliche Parameter diverser Kommandozeilenbefehle und Konfigurationsdateien aufgelistet. Oft ist die grösste Hürde, überhaupt den Einstieg in Pervasive Linux zu finden. Der Aufbau einer funktionsfähigen Entwicklungsumgebung kann sehr frustrierend sein. Oftmals sind Informationen auf den relevanten Webseiten nicht sofort auffind- bar. Dieses Buch soll den Einstieg in die Entwicklung von Linux-Anwendungen für

VII VIII Vorwort das Pervasive Computing erleichtern, indem es jeweils mit Beispielen die Grund- lagen für die benötigten Schritte erläutert. Dabei werden auch Werkzeuge vorge- stellt, die nicht spezifisch für Pervasive Linux sind, aber bei der Benutzung und Entwicklung häufig verwendet werden. Es wird erklärt, welche Besonderheiten beim Einsatz von Linux in eingebetteten Systemen zu beachten sind, welche Code- und Informationsquellen es gibt, welche Aufgaben ein eingebettetes Linuxsystem zu erfüllen hat und aus welchen Bestand- teilen es besteht. Die Softwareentwicklung wird mit Hilfe gängiger Werkzeuge bei- spielhaft dargestellt. Die Beispiele orientieren sich an Linux-Systemen, die auf tragbaren digi- talen persönlichen Organisationshilfen (engl.: Personal Digital Assistants Ð PDA, bzw. Handhelds), mobilen Internetgeräten (engl.: Mobile Internet Device Ð MID), Tablett-Computern und Mobiltelefonen bzw. so genannten Smartphones einsetzbar sind, da diese Art Hardware-Grundlage als Massenware relativ unkompliziert und günstig für jedermann erhältlich ist und es für diese Systeme oft eine breite Linux- Unterstützung gibt. Die Konzepte lassen sich aber auch auf andere eingebettete Sys- teme übertragen. Das Motto des Buches lässt ich also wie folgt formulieren: Linux macht Spass. Pervasive Linux macht den Spass allgegenwärtig.

Danksagung Mein Dank gilt meiner Frau Bettina und meinem Redakteur Hermann Engesser vom Springer Verlag für die schier endlose Geduld und Unterstützung bei diesem Buch- projekt. Ausserdem möchte ich mich bei Silke und Clemens van Dinther, Jan Burchhardt und Jens Kretzschmar fürs Korrekturlesen des Manuskripts und die konstruktiven Anregungen bedanken.

Magstadt, Deutschland Christoph Czernohous Juni 2011 Inhaltsverzeichnis

Teil I Systembestandteile

1 Pervasive Computing ...... 3 1.1 Ressourcenbeschränkung ...... 3 1.1.1 Speicherverwaltung ...... 3 1.1.2 Grafische Benutzerschnittstellen ...... 4 1.2 Grafik ...... 5 1.2.1 Vektorgrafik ...... 5 1.2.2 Bitmap-Grafik ...... 5 1.3 Mobilität ...... 6 1.3.1 Kontextverarbeitung ...... 6 1.3.2 Datensicherheit ...... 7

2 Hardware ...... 9 2.1 Prozessor ...... 9 2.2 Speicher ...... 10 2.2.1 Arbeitsspeicher ...... 10 2.2.2 Permanenter Speicher ...... 10 2.3 Eingabe und Ausgabe ...... 13 2.4 Energieversorgung ...... 13

3 Software ...... 15 3.1 Boot Loader ...... 15 3.1.1 Das U-Boot Ð Universal Boot Loader ...... 16 3.1.2 ARM Boot Loader ...... 16 3.1.3 Linux Loader (LILO) ...... 17 3.1.4 Grand Unified Boot Loader (GRUB) ...... 17 3.1.5 blob ...... 17 3.1.6 Micromonitor (uMon) ...... 18 3.1.7 RedBoot ...... 18 3.1.8 colilo ...... 18 3.1.9 Qi ...... 19

IX X Inhaltsverzeichnis

3.2 Linux Kernel ...... 19 3.2.1 Kernel Module ...... 19 3.2.2 Framebuffer ...... 20 3.2.3 uClinux Ð virtuelle Speicherverwaltung ...... 20 3.3 Gerätetreiber ...... 20 3.3.1 Character Device ...... 21 3.3.2 Block Device ...... 21 3.3.3 Memory Technology Device (MTD) ...... 21 3.4 Dateisystemtypen ...... 22 3.4.1 Journaling Flash File System (JFFS) ...... 23 3.4.2 Journaling Flash File System, Version 2 (JFFS2) ...... 23 3.4.3 Unsorted Block Images File System (UBIFS) ...... 23 3.4.4 LogFS ...... 23 3.4.5 Yet Another Flash File System (YAFFS) ...... 24 3.4.6 Squashfs ...... 24 3.4.7 (cramfs) ...... 24 3.4.8 Second Extended File System (EXT2), EXT3 und EXT4 ...... 24 3.4.9 Network File System (NFS) ...... 25 3.4.10 Common Internet File System (CIFS) ...... 25 3.5 Daten ...... 25 3.5.1 Zeichenkodierungen ...... 26 3.5.2 Datenformate ...... 26 3.6 Benutzerschnittstellen ...... 30 3.6.1 Anmeldung und Benutzerverwaltung mit TinyLogin ...... 31 3.6.2 BusyBox ...... 31 3.6.3 XML Language (XUL) ...... 32 3.6.4 ...... 32 3.6.5 GIMP Toolkit (GTK+) ...... 33 3.6.6 ...... 33 3.6.7 for Embedded Linux ...... 34 3.6.8 Nano-X ...... 34 3.6.9 MiniGUI ...... 34 3.6.10 freesmartphone.org (FSO) ...... 35 3.6.11 GPE Palmtop Environment (GPE) ...... 35 3.6.12 Open Palmtop Integrated Environment (OPIE) ...... 40 3.6.13 GNOME Mobile ...... 44 3.6.14 Clutter ...... 44 3.7 Distributionen und Plattformen ...... 44 3.7.1 OpenWrt ...... 45 3.7.2 Ångström ...... 45 3.7.3 Puppy Linux...... 45 3.7.4 Android ...... 46 3.7.5 MeeGo ...... 46 3.7.6 ...... 46 3.7.7 Linaro ...... 47 Inhaltsverzeichnis XI

3.8 Datenaustausch ...... 47 3.8.1 SyncML ...... 47 3.8.2 Funambol ...... 48 3.8.3 OpenOBEX ...... 48 3.8.4 OpenSync ...... 48 3.8.5 Synthesis ...... 49 3.8.6 SyncEvolution ...... 49

4 Netzwerk ...... 51 4.1 Ethernet ...... 51 4.2 Serielle Schnittstelle...... 52 4.2.1 Konfiguration ...... 53 4.3 Universal Serial Bus (USB) ...... 54 4.3.1 Linux USB ...... 55 4.4 Wireless LAN (WLAN) ...... 56 4.4.1 Sicherheit ...... 57 4.4.2 Werkzeuge ...... 58 4.5 Infrarot...... 59 4.5.1 Linux-IrDA ...... 59 4.5.2 Werkzeuge ...... 60 4.5.3 Protokolle ...... 61 4.6 Bluetooth ...... 63 4.6.1 Sicherheit ...... 63 4.6.2 BlueZ ...... 64 4.7 Mobilfunk ...... 69 4.7.1 Openmoko ...... 70 4.7.2 Android ...... 70 4.7.3 GPE Phone Edition ...... 70 4.7.4 LiMo Foundation...... 70 4.7.5 phoneME ...... 71

Teil II Softwareentwicklung

5 Werkzeuge ...... 75 5.1 GCC Ð GNU Compiler Collection ...... 75 5.1.1 Das Kreuz mit dem Cross Compiler ...... 75 5.1.2 Toolchain ...... 76 5.1.3 GNU Project Debugger (GDB) ...... 84 5.2 Hilfsmittel ...... 85 5.2.1 patch ...... 85 5.2.2 make ...... 86 5.2.3 Wget ...... 87 5.2.4 pkg-config ...... 88 XII Inhaltsverzeichnis

5.2.5 Das Source Kommando ...... 90 5.2.6 Die GNU Autotools und das GNU Build System ...... 91 5.2.7 qmake ...... 97 5.2.8 Ant ...... 98 5.2.9 Maven ...... 100 5.2.10 BitBake ...... 102 5.2.11 crosstool ...... 104 5.2.12 Scratchbox ...... 106 5.2.13 Scratchbox 2 ...... 106 5.2.14 OpenEmbedded ...... 106 5.2.15 Poky ...... 111 5.2.16 Yocto Project ...... 111 5.2.17 Terminal-Emulation ...... 112 5.2.18 Xnest ...... 113 5.2.19 Xephyr ...... 114 5.3 Virtualisierung ...... 114 5.3.1 QEMU ...... 115 5.4 Integrierte Entwicklungsumgebungen ...... 116 5.4.1 Eclipse ...... 117 5.5 Entwicklung auf der Zielplattform ...... 127 5.6 Paketierung und Softwareverwaltung ...... 130 5.6.1 Itsy Package Management System () ...... 131 5.6.2 Open Services Gateway Initiative (OSGi) ...... 135 5.6.3 Package (dpkg) ...... 137

6 Anwendungs- und Systementwicklung ...... 139 6.1 Strukturierung ...... 139 6.2 Programmiersprachen ...... 139 6.2.1 C ...... 140 6.2.2 Java ...... 147 6.2.3 Perl ...... 152 6.2.4 Python ...... 153 6.2.5 JavaScript ...... 154 6.3 Entwicklungsumgebung ...... 154 6.3.1 Verzeichnisstruktur und Dateien ...... 155 6.4 Interprozesskommunikation (IPC) ...... 156 6.4.1 Linux Systemaufrufe ...... 156 6.4.2 D-Bus ...... 161 6.4.3 Web Services ...... 161 6.4.4 CORBA ...... 162 6.5 Grafische Benutzerschnittstellen...... 163 6.5.1 GTK+ ...... 163 6.5.2 Enlightenment ...... 168 6.5.3 GPE Palmtop Environment ...... 173 Inhaltsverzeichnis XIII

6.5.4 Qt for Embedded Linux ...... 173 6.5.5 Android ...... 174 6.6 Portabilität (von C-Programmen) ...... 184 6.6.1 Vorzeichenbehaftung des Datentyps char ...... 184 6.6.2 Byte Reihenfolge (Endianness) ...... 185 6.6.3 Grösse des Datentyps Integer ...... 186 6.6.4 Calling Convention ...... 186 6.6.5 uClinux ...... 186 6.7 Web Anwendungen ...... 187 6.7.1 WebKit ...... 188 6.7.2 HTML5 ...... 188 6.7.3 PhoneGap ...... 191 6.7.4 Wireless Application Protocol (WAP) ...... 192 6.8 Globalisierung ...... 192 6.8.1 Internationalisierung ...... 192 6.8.2 Lokalisierung ...... 199 6.9 Barrierefreiheit ...... 199

Literaturverzeichnis ...... 201

Sachverzeichnis ...... 203 Teil I Systembestandteile Kapitel 1 Pervasive Computing

Bei Pervasive Computing geht es hauptsächlich um kleine, verteilte, auf unter- schiedlichster Hardware basierende Computer, die auf diverse Weise mit anderen Geräten oder dem Menschen kommunizieren. Oft ist auch von eingebetteten Syste- men (engl.: Embedded Systems) oder so genannter Rechenallgegenwart (engl.: Ubi- quitous Computing) die Rede. Systeme des Pervasive Computing besitzen besondere Eigenschaften, die es bei deren Einsatz und insbesondere bei der Software-Entwicklung für diese Systeme zu berücksichtigen gilt. Besonders für Anwender und Entwickler, die aus dem Bereich des Desktop Computing kommen, gibt es einige zusätzliche Aspekte zu beachten.

1.1 Ressourcenbeschränkung

Wie in allen Bereichen der Informationstechnik steigt auch die Leistungsfähigkeit von eingebetteten Geräten immer weiter, während gleichzeitig die physikalischen Bauteile kleiner und integrierter werden. Nichtsdestotrotz sind die in diesem Um- feld zur Verfügung stehenden Betriebsmittel und Ressourcen im Vergleich zu gängi- gen Arbeitsplatzrechnern deutlich beschränkt. Das betrifft in erster Linie die Leis- tungsfähigkeit der verwendeten Prozessoren und den verfügbaren Speicher (sowohl Arbeits- als auch Ablagespeicher), aber auch Kommunikations- und Netzwerkver- bindungen sowie die Energieversorgung. All diese Aspekte spielen im Pervasive Computing eine zentrale Rolle und müssen bei der Entwicklung solcher Systeme bedacht werden.

1.1.1 Speicherverwaltung

Für die Verwaltung des Zugriffs auf Arbeitsspeicher besitzen Prozessoren üblicher- weise eine Speicherverwaltungseinheit (engl.: Memory Management Unit Ð MMU). Die Aufgabe einer MMU ist es, laufenden Prozessen Arbeitsspeicher zur Verfügung zu stellen, der für einen konkreten Prozess exklusiv reserviert ist, so dass andere Prozesse den Inhalt des Speicherbereiches nicht auslesen oder verändern können.

C. Czernohous, Pervasive Linux, X.systems.press, 3 DOI 10.1007/978-3-540-68426-8_1, C Springer-Verlag Berlin Heidelberg 2012