Eingebettete Geräte und Entwicklung eingebetteter Systeme - ein Überblick
Auf Secure Code Warrior sind wir stets bestrebt, unser Schulungsangebot zu erweitern. Um Entwicklern und Sicherheitsverantwortlichen die Möglichkeit zu geben, sichere eingebettete Systeme zu entwickeln, haben wir uns in die Welt der Sicherheit eingebetteter Systeme eingearbeitet. In diesem Beitrag stellen wir die wichtigsten Dinge vor, die Entwickler und Architekten über die Entwicklung sicherer eingebetteter Systeme wissen sollten.
Ein eingebettetes Gerät ist eine unabhängige Recheneinheit mit eigener mikroprozessorbasierter Hardware und Software. Sie werden in der Regel zur Ausführung spezieller Funktionen verwendet, entweder unabhängig oder als Teil größerer Systeme.
Was ist ein eingebettetes Gerät und System?
Eingebettete Geräte sind zweckgebundene Computersysteme mit minimalistischer Hardware und Software, die für die Ausführung bestimmter Funktionen programmiert sind. Je nach ihrem Zweck können eingebettete Geräte unterschiedlich komplex sein.
Wenn ein eingebettetes System komplizierte, ressourcenintensive Operationen durchführen muss, kann seine Hardware aus mehreren Prozessoren mit verschiedenen miteinander verbundenen Peripheriegeräten bestehen. Wenn es jedoch für eine einfache Aufgabe konzipiert ist, kann es auch nur einen einzigen Mikrocontroller enthalten.
Einige eingebettete Systeme sind Blackboxes ohne Benutzeroberfläche, während andere detaillierte grafische Benutzeroberflächen haben können.
Beispiele für eingebettete Geräte
Eingebettete Geräte finden in zahlreichen Branchen Anwendung, von der Luft- und Raumfahrt bis zur Computerbranche und von Haushaltsgeräten bis zum Gesundheitswesen. Hier sind ein paar Beispiele:
- Ein Thermostat in einem Klimagerät.
- Ein Fitness-Tracker mit kleinen elektrischen Bauteilen, auf denen ein winziges Betriebssystem läuft, das nicht mehr kann als Ihre Gesundheitsdaten aufzuzeichnen und zu synchronisieren.
- Digitale Klimakontrollsysteme.
- Navigationssysteme in Flugzeugen.
- Digitale Uhren.
- GPS-Geräte.
- Wi-Fi-Komponenten in Mikrowellenherden und anderer Unterhaltungselektronik.
- Blutdruck- und Herzschlagmessgeräte.
- Vernetzungskomponente in einem MRT-Gerät, die Daten an die Cloud sendet.
Ist ein Laptop ein eingebettetes Gerät?
Kurze Antwort: Nein. Lange Antwort:
Per Definition umfasst ein eingebettetes Gerät die gesamte Software und Hardware, die es zur Ausführung seiner Funktionen benötigt. Ein Laptop verpackt in der Tat verschiedene Hardwarekomponenten in ein Metallgehäuse und umfasst die gesamte Software, die zur Bereitstellung seiner Funktionen erforderlich ist.
Im Gegensatz zu typischen eingebetteten Systemen, die einen vordefinierten, minimalen Funktionsumfang haben, ist ein Laptop jedoch universeller einsetzbar und kann für eine Vielzahl von Aktivitäten verwendet werden.
Eingebettete Geräte im Internet der Dinge
Eingebettete Systeme sind das Herzstück des IoT. Ihr intelligenter Kühlschrank kann dank eines eingebetteten Geräts über Ihr Mobilgerät gesteuert werden. Es ist ein eingebettetes Gerät in Ihrem Sicherheitssystem, mit dem Sie CCTV-Aufnahmen aus tausend Meilen Entfernung ansehen können. Und wenn Sie einen Knopf drücken, um Ihr Auto auf Autopilot zu stellen, ist es ein eingebettetes Gerät, das hinter den Kulissen die ganze Magie bewirkt.
Lebenszyklus der Entwicklung eingebetteter Software
Der typische Lebenszyklus der Softwareentwicklung eines eingebetteten Geräts umfasst die folgenden Schritte:
Schritt 1: Zweck und Anforderungen
Ein eingebettetes Gerät hat einen bestimmten und präzisen Funktionsumfang. Deshalb ist es sehr wichtig, seinen Zweck und seine Anforderungen vor Beginn der Entwicklung explizit zu formulieren. Es wird empfohlen, ein detailliertes Entwurfsdokument für das System zu erstellen. Beantworten Sie Fragen wie:
- Welche Funktionen wird das Gerät erfüllen?
- Wird sie ein Teil einer anderen Maschine sein, oder wird sie eigenständig funktionieren?
- Soll das Gerät über eine Benutzeroberfläche verfügen? Wenn ja, reicht eine Befehlszeile aus, oder ist eine grafische Benutzeroberfläche erforderlich?
- Welche Größen-, Kosten- oder Stromverbrauchsgrenzen muss das Gerät einhalten?
- Gibt es Leistungsmaßstäbe? Wird z. B. erwartet, dass das Gerät in Echtzeit oder innerhalb bestimmter Schwellenwerte reagiert?
Schritt 2: Systemarchitektur
Sobald wir die einzigartigen Systemanforderungen ermittelt haben, können wir die Systemarchitektur entwerfen. Beantworten Sie Fragen wie:
- Welche Hardwarekomponenten werden für die Entwicklung des Geräts benötigt? Dazu gehört die Identifizierung der Schaltkreise, Prozessorchips und Mikrocontroller sowie aller erforderlichen internen und externen Peripheriegeräte.
- Wie viel Strom werden die Komponenten benötigen?
- Wird das Gerät mit dem Internet verbunden sein?
- Welche Schnittstellen müssen hinzugefügt/entwickelt werden, damit das Gerät mit anderen Geräten oder der größeren Maschine verbunden werden kann?
- Wie werden Sie die Verschlüsselung umsetzen? (denken Sie an Algorithmen, Schlüsselspeicherung usw.)
- Wie werden Sie potenzielle Schwachstellen, Sicherheitslücken und Malware erkennen und vermeiden?
Schritt 3: Auswahl des Betriebssystems
Die Wahl des Betriebssystems entscheidet oft über die Effizienz Ihrer eingebetteten Anwendungen, also wählen Sie mit Bedacht. Windows für IoT kann bei der Grafik punkten, bietet aber keine Hardware-Unterstützung. Embedded Linux und Android sind kostenlos, während für VxWorks und Windows für IoT Lizenzkosten anfallen.
Bei Open-Source-Systemen wie Linux und Android haben die Entwickler mehr Kontrolle über den Kernel; bei proprietären Systemen hingegen können Sie nur mit den Standardfunktionen des Kernels arbeiten.
Es ist auch wichtig, bei der Auswahl eines Betriebssystems die Sicherheitsaspekte zu berücksichtigen. Werden Sicherheits-Patches schnell veröffentlicht, falls Sicherheitslücken entdeckt werden? Gibt es einen eingebauten Schutz gegen die häufigsten Angriffe auf die Cybersicherheit?
Schritt 4: Die Entwicklungswerkzeuge
Verschiedene Programmiersprachen und Frameworks haben verschiedene Vor- und Nachteile. Je nach Ihren Anforderungen an Funktionen, Geschwindigkeit und Zuverlässigkeit können Sie eine Sprache/ein Framework der anderen vorziehen.
Wenn Ihre Anwendung webbasiert ist und Sie eine hohe Leistung wünschen, wählen Sie Java.
Wenn Sie jedoch den schnellsten Durchsatz wünschen, wählen Sie C/C++. Wenn Sie die beste Unterstützung für Bibliotheken von Drittanbietern wünschen, sollten Sie sich für Python entscheiden.
Schritt 5: Programmieren, überarbeiten, testen, weiterprogrammieren
Sobald Sie sich für eine Entwicklungsplattform entschieden haben, können Sie mit dem Programmieren beginnen. Denken Sie daran, dass eingebettete Systeme empfindliche Geräte mit begrenzten Hardware- und Softwareressourcen sind. Daher ist es von entscheidender Bedeutung, die besten Praktiken in Bezug auf Anwendungssicherheit und Leistung zu beachten.
Code-Reviews helfen bei der Optimierung des Codes und bei der Identifizierung potenzieller Bugs. Außerdem müssen Sie so rigoros wie möglich testen. Stellen Sie sicher, dass Sie eine erschöpfende Liste aller Testfälle zusammenstellen, auf die das Gerät beim Einsatz in der Produktion stoßen könnte.
Schritt 6: Wartung und Unterstützung
Wie bei jeder anderen Anwendung/jedem anderen Gerät endet der Lebenszyklus nicht, wenn das eingebettete Gerät ausgeliefert und installiert wurde. Während das Gerät in der Produktion eingesetzt wird, werden neue Anwendungsfälle identifiziert, die das Hinzufügen neuer Funktionen erfordern. Gemeldete Fehler können auch die Veröffentlichung neuer Firmware-Updates erforderlich machen.
Die wichtigsten eingebetteten Programmiersprachen
Es gibt viele seriöse Organisationen wie IEEE und TIOBE, die eine Rangliste der Programmiersprachen nach Beliebtheit und Verwendung erstellen. Unabhängig davon, ob Sie sich den TIOBE-Index oder das IEEE Spectrum ansehen, werden Sie jedoch ein gemeinsames Thema feststellen.
Die Top 3 Sprachen sind immer C, Python und Java. Im TIOBE-Index für Juli 2021 steht C auf Platz 1, Java auf Platz 2 und Python auf Platz 3. Laut IEEE Spectrum's Ranking für eingebettete Programmiersprachen lautet die Reihenfolge: Python, Java, und dann C.
Wie unterscheidet sich in Java, C oder Python geschriebene Firmware?
Verschiedene Sprachen verwalten den Speicher, die Interaktion mit dem Betriebssystem und die Laufzeit auf unterschiedliche Weise. Java-Anwendungen werden z. B. in einer speziellen Laufzeitumgebung ausgeführt, die als Java Virtual Machine (JVM) bekannt ist.
Die Speicherverwaltung in C/C++ erfolgt manuell, während Sie sich in Java oder Python nicht selbst um die Speicherverwaltung kümmern müssen; die Sprache erledigt das für Sie. Hinzu kommt, dass Sie in C Ihren Müll selbst einsammeln müssen, d. h. wenn Sie einen Speicherbereich dynamisch zuweisen, müssen Sie ihn auch explizit wieder freigeben. Wenn Sie das nicht tun, führt das zu einem Speicherleck. In Java oder Python wird die Garbage Collection automatisch durchgeführt. Allerdings ist C von Natur aus viel schneller als Java oder Python.
Eine Sache, die C und Java (aber insbesondere C) im Vergleich zu Python fehlt, ist die Verfügbarkeit von Bibliotheken von Drittanbietern. Python verfügt über eine reichhaltigere Datenbank von Bibliotheken, die es Entwicklern viel einfacher macht, bestimmte Funktionen hinzuzufügen.
Insgesamt sollten Sie C wählen, wenn:
- Sie wollen eine Low-Level-Schnittstelle mit dem Betriebssystem und der Hardware.
- Sie wollen die bestmögliche Leistung.
- Ihre Entwickler sind in C/C++ bewandert.
- Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.
Verwenden Sie Python, wenn:
- Sie möchten datenwissenschaftliche oder maschinelle Lernalgorithmen implementieren.
- Sie möchten umfangreiche Unterstützung für Bibliotheken von Drittanbietern.
- Sie sind damit einverstanden, Geschwindigkeit gegen Benutzerfreundlichkeit einzutauschen.
- Sie haben nur begrenzte Erfahrung in der Embedded-Entwicklung.
- Sie brauchen keine Low-Level-Schnittstelle mit dem Betriebssystem oder der Hardware.
Verwenden Sie Java, wenn:
- Sie erstellen Webanwendungen.
- Sie wollen eine einfachere Entwicklung als in C, aber dennoch mehr Leistung als in Python.
- Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.
Wird C langsam aufhören, die erste Wahl für die Embedded-Entwicklung zu sein?
Hochsprachen erleichtern die Programmierung, indem sie die Komplexität, die sich in C einfach nicht vermeiden lässt, abstrahieren. Dennoch ist C trotz der Einführung neuer Sprachen und Frameworks seit Jahrzehnten die erste Wahl bei der Embedded-Entwicklung.
Der Grund dafür ist, dass die Geschwindigkeit, Leistung und Zuverlässigkeit, die sie bietet, immer noch unerreicht sind. Die Tatsache, dass Python und große Teile des Java-Ökosystems (einschließlich der Laufzeitumgebung, der Sprache und des Compilers) in C geschrieben sind, spricht Bände über die Effizienz und Beständigkeit der Sprache.
Allerdings ist C für neue Entwickler, die die Einfachheit von Sprachen wie Python bevorzugen, unbestreitbar schwieriger zu erlernen. Dies führt zu einem spürbaren Rückgang der C-Entwicklergemeinde. Auch die zunehmende Entwicklung von KI- und ML-Anwendungen führt dazu, dass die Menschen Python gegenüber C bevorzugen, einfach weil es eine größere Bibliotheksunterstützung bietet.
Es ist wichtig, daran zu denken, dass Python erst seit kurzem Teil der Debatte um die wichtigste Programmiersprache für Embedded-Systeme ist. Ja, seine Akzeptanz wird in den kommenden Jahren weiter steigen, aber wir erwarten nicht, dass C jemals aufhören wird, die erste Wahl für die Embedded-Entwicklung zu sein.
Warum sichere Kodierung in C/C++ wichtig ist
Beim Schreiben von Code in C/C++ kann eine Menge schief gehen. Der Zugriff auf eine Speicheradresse, die nicht mehr auf gültige Daten verweist, oder die falsche gemeinsame Nutzung von Daten zwischen Threads kann zum Absturz Ihrer gesamten Anwendung führen.
Bei eingebetteten Geräten sind diese Auswirkungen weitaus bedeutender, da ein Absturz in diesen Geräten dazu führen kann, dass eine viel größere Maschine nicht mehr funktioniert. Wenn z. B. das Autopilot-Modul in einem Auto ausfällt, kann das Auto Hindernissen nicht mehr ausweichen.
Hier sind weitere Gründe, warum die sichere Kodierung von C/C++-Anwendungen so wichtig ist:
- Unsichere Speicherbehandlung (Nullzeiger, Speicherverfälschung, Stapelüberläufe, Puffer- und Heap-Überläufe) führen zum Absturz der gesamten Anwendung.
- Zeiger sind ein fester Bestandteil von C und C++. Der Umgang mit ihnen erfordert äußerste Sorgfalt und tiefgreifende Kenntnisse der zugrunde liegenden Konzepte.
- Die Speicherbereinigung erfolgt manuell. Daher müssen Programmierer jeden dynamisch zugewiesenen Speicher explizit löschen. Nicht freigegebener oder nicht korrekt freigegebener Speicher kann zu Speicherlecks oder -beschädigung führen.
- Es fehlt an standardisierten APIs für fortgeschrittene Datenstrukturen (z. B. Hashtabellen, Mengen usw.), so dass die Entwickler gezwungen sind, das Rad neu zu erfinden.
Es ist absolut wichtig, dass Entwickler in der sicheren Programmierung von C/C++-Anwendungen geschult werden. Secure Code Warrior bietet eine personalisierte learning platform mit interaktiven Herausforderungen, courses und Bewertungen, die es Entwicklern ermöglichen, sicheren C/C++-Code zu schreiben. Hier geht es um sprachen- und rahmenspezifische Inhalte, nicht nur um eine Verbesserung der allgemeinen konzeptionellen Schulung.
Erfahren Sie, wie wir die Automobil- und Transportbranche unterstützen. Oder probieren Sie noch heute eine Embed-Focus-Coding-Challenge aus, um zu erfahren, wie wir Entwickler in die Lage versetzen, sichere Embedded-Anwendungen zu schreiben!
In diesem Beitrag erhalten Sie einen Überblick über eingebettete Geräte und die Entwicklung eingebetteter Systeme.
Secure Code Warrior macht sicheres Programmieren zu einer positiven und fesselnden Erfahrung für Entwickler, die ihre Fähigkeiten ausbauen. Wir leiten jeden Programmierer auf seinem bevorzugten Lernpfad an, damit sicherheitskompetente Entwickler zu den täglichen Superhelden unserer vernetzten Welt werden.
Secure Code Warrior ist für Ihr Unternehmen da, um Sie dabei zu unterstützen, Ihren Code über den gesamten Lebenszyklus der Softwareentwicklung hinweg zu sichern und eine Kultur zu schaffen, in der Cybersicherheit an erster Stelle steht. Ganz gleich, ob Sie AppSec-Manager, Entwickler, CISO oder ein anderer Sicherheitsverantwortlicher sind, wir können Ihrem Unternehmen helfen, die mit unsicherem Code verbundenen Risiken zu reduzieren.
Demo buchenSecure Code Warrior macht sicheres Programmieren zu einer positiven und fesselnden Erfahrung für Entwickler, die ihre Fähigkeiten ausbauen. Wir leiten jeden Programmierer auf seinem bevorzugten Lernpfad an, damit sicherheitskompetente Entwickler zu den täglichen Superhelden unserer vernetzten Welt werden.
Secure Code Warrior baut eine Kultur von sicherheitsorientierten Entwicklern auf, indem es ihnen die Fähigkeiten vermittelt, sicher zu programmieren. Unser Flaggschiff Agile Learning Platform bietet relevante fähigkeitsbasierte Pfade, praktische Übungen missions und kontextbezogene Tools, mit denen Entwickler ihre Fähigkeiten zum Schreiben von sicherem Code schnell erlernen, aufbauen und anwenden können.
Auf Secure Code Warrior sind wir stets bestrebt, unser Schulungsangebot zu erweitern. Um Entwicklern und Sicherheitsverantwortlichen die Möglichkeit zu geben, sichere eingebettete Systeme zu entwickeln, haben wir uns in die Welt der Sicherheit eingebetteter Systeme eingearbeitet. In diesem Beitrag stellen wir die wichtigsten Dinge vor, die Entwickler und Architekten über die Entwicklung sicherer eingebetteter Systeme wissen sollten.
Ein eingebettetes Gerät ist eine unabhängige Recheneinheit mit eigener mikroprozessorbasierter Hardware und Software. Sie werden in der Regel zur Ausführung spezieller Funktionen verwendet, entweder unabhängig oder als Teil größerer Systeme.
Was ist ein eingebettetes Gerät und System?
Eingebettete Geräte sind zweckgebundene Computersysteme mit minimalistischer Hardware und Software, die für die Ausführung bestimmter Funktionen programmiert sind. Je nach ihrem Zweck können eingebettete Geräte unterschiedlich komplex sein.
Wenn ein eingebettetes System komplizierte, ressourcenintensive Operationen durchführen muss, kann seine Hardware aus mehreren Prozessoren mit verschiedenen miteinander verbundenen Peripheriegeräten bestehen. Wenn es jedoch für eine einfache Aufgabe konzipiert ist, kann es auch nur einen einzigen Mikrocontroller enthalten.
Einige eingebettete Systeme sind Blackboxes ohne Benutzeroberfläche, während andere detaillierte grafische Benutzeroberflächen haben können.
Beispiele für eingebettete Geräte
Eingebettete Geräte finden in zahlreichen Branchen Anwendung, von der Luft- und Raumfahrt bis zur Computerbranche und von Haushaltsgeräten bis zum Gesundheitswesen. Hier sind ein paar Beispiele:
- Ein Thermostat in einem Klimagerät.
- Ein Fitness-Tracker mit kleinen elektrischen Bauteilen, auf denen ein winziges Betriebssystem läuft, das nicht mehr kann als Ihre Gesundheitsdaten aufzuzeichnen und zu synchronisieren.
- Digitale Klimakontrollsysteme.
- Navigationssysteme in Flugzeugen.
- Digitale Uhren.
- GPS-Geräte.
- Wi-Fi-Komponenten in Mikrowellenherden und anderer Unterhaltungselektronik.
- Blutdruck- und Herzschlagmessgeräte.
- Vernetzungskomponente in einem MRT-Gerät, die Daten an die Cloud sendet.
Ist ein Laptop ein eingebettetes Gerät?
Kurze Antwort: Nein. Lange Antwort:
Per Definition umfasst ein eingebettetes Gerät die gesamte Software und Hardware, die es zur Ausführung seiner Funktionen benötigt. Ein Laptop verpackt in der Tat verschiedene Hardwarekomponenten in ein Metallgehäuse und umfasst die gesamte Software, die zur Bereitstellung seiner Funktionen erforderlich ist.
Im Gegensatz zu typischen eingebetteten Systemen, die einen vordefinierten, minimalen Funktionsumfang haben, ist ein Laptop jedoch universeller einsetzbar und kann für eine Vielzahl von Aktivitäten verwendet werden.
Eingebettete Geräte im Internet der Dinge
Eingebettete Systeme sind das Herzstück des IoT. Ihr intelligenter Kühlschrank kann dank eines eingebetteten Geräts über Ihr Mobilgerät gesteuert werden. Es ist ein eingebettetes Gerät in Ihrem Sicherheitssystem, mit dem Sie CCTV-Aufnahmen aus tausend Meilen Entfernung ansehen können. Und wenn Sie einen Knopf drücken, um Ihr Auto auf Autopilot zu stellen, ist es ein eingebettetes Gerät, das hinter den Kulissen die ganze Magie bewirkt.
Lebenszyklus der Entwicklung eingebetteter Software
Der typische Lebenszyklus der Softwareentwicklung eines eingebetteten Geräts umfasst die folgenden Schritte:
Schritt 1: Zweck und Anforderungen
Ein eingebettetes Gerät hat einen bestimmten und präzisen Funktionsumfang. Deshalb ist es sehr wichtig, seinen Zweck und seine Anforderungen vor Beginn der Entwicklung explizit zu formulieren. Es wird empfohlen, ein detailliertes Entwurfsdokument für das System zu erstellen. Beantworten Sie Fragen wie:
- Welche Funktionen wird das Gerät erfüllen?
- Wird sie ein Teil einer anderen Maschine sein, oder wird sie eigenständig funktionieren?
- Soll das Gerät über eine Benutzeroberfläche verfügen? Wenn ja, reicht eine Befehlszeile aus, oder ist eine grafische Benutzeroberfläche erforderlich?
- Welche Größen-, Kosten- oder Stromverbrauchsgrenzen muss das Gerät einhalten?
- Gibt es Leistungsmaßstäbe? Wird z. B. erwartet, dass das Gerät in Echtzeit oder innerhalb bestimmter Schwellenwerte reagiert?
Schritt 2: Systemarchitektur
Sobald wir die einzigartigen Systemanforderungen ermittelt haben, können wir die Systemarchitektur entwerfen. Beantworten Sie Fragen wie:
- Welche Hardwarekomponenten werden für die Entwicklung des Geräts benötigt? Dazu gehört die Identifizierung der Schaltkreise, Prozessorchips und Mikrocontroller sowie aller erforderlichen internen und externen Peripheriegeräte.
- Wie viel Strom werden die Komponenten benötigen?
- Wird das Gerät mit dem Internet verbunden sein?
- Welche Schnittstellen müssen hinzugefügt/entwickelt werden, damit das Gerät mit anderen Geräten oder der größeren Maschine verbunden werden kann?
- Wie werden Sie die Verschlüsselung umsetzen? (denken Sie an Algorithmen, Schlüsselspeicherung usw.)
- Wie werden Sie potenzielle Schwachstellen, Sicherheitslücken und Malware erkennen und vermeiden?
Schritt 3: Auswahl des Betriebssystems
Die Wahl des Betriebssystems entscheidet oft über die Effizienz Ihrer eingebetteten Anwendungen, also wählen Sie mit Bedacht. Windows für IoT kann bei der Grafik punkten, bietet aber keine Hardware-Unterstützung. Embedded Linux und Android sind kostenlos, während für VxWorks und Windows für IoT Lizenzkosten anfallen.
Bei Open-Source-Systemen wie Linux und Android haben die Entwickler mehr Kontrolle über den Kernel; bei proprietären Systemen hingegen können Sie nur mit den Standardfunktionen des Kernels arbeiten.
Es ist auch wichtig, bei der Auswahl eines Betriebssystems die Sicherheitsaspekte zu berücksichtigen. Werden Sicherheits-Patches schnell veröffentlicht, falls Sicherheitslücken entdeckt werden? Gibt es einen eingebauten Schutz gegen die häufigsten Angriffe auf die Cybersicherheit?
Schritt 4: Die Entwicklungswerkzeuge
Verschiedene Programmiersprachen und Frameworks haben verschiedene Vor- und Nachteile. Je nach Ihren Anforderungen an Funktionen, Geschwindigkeit und Zuverlässigkeit können Sie eine Sprache/ein Framework der anderen vorziehen.
Wenn Ihre Anwendung webbasiert ist und Sie eine hohe Leistung wünschen, wählen Sie Java.
Wenn Sie jedoch den schnellsten Durchsatz wünschen, wählen Sie C/C++. Wenn Sie die beste Unterstützung für Bibliotheken von Drittanbietern wünschen, sollten Sie sich für Python entscheiden.
Schritt 5: Programmieren, überarbeiten, testen, weiterprogrammieren
Sobald Sie sich für eine Entwicklungsplattform entschieden haben, können Sie mit dem Programmieren beginnen. Denken Sie daran, dass eingebettete Systeme empfindliche Geräte mit begrenzten Hardware- und Softwareressourcen sind. Daher ist es von entscheidender Bedeutung, die besten Praktiken in Bezug auf Anwendungssicherheit und Leistung zu beachten.
Code-Reviews helfen bei der Optimierung des Codes und bei der Identifizierung potenzieller Bugs. Außerdem müssen Sie so rigoros wie möglich testen. Stellen Sie sicher, dass Sie eine erschöpfende Liste aller Testfälle zusammenstellen, auf die das Gerät beim Einsatz in der Produktion stoßen könnte.
Schritt 6: Wartung und Unterstützung
Wie bei jeder anderen Anwendung/jedem anderen Gerät endet der Lebenszyklus nicht, wenn das eingebettete Gerät ausgeliefert und installiert wurde. Während das Gerät in der Produktion eingesetzt wird, werden neue Anwendungsfälle identifiziert, die das Hinzufügen neuer Funktionen erfordern. Gemeldete Fehler können auch die Veröffentlichung neuer Firmware-Updates erforderlich machen.
Die wichtigsten eingebetteten Programmiersprachen
Es gibt viele seriöse Organisationen wie IEEE und TIOBE, die eine Rangliste der Programmiersprachen nach Beliebtheit und Verwendung erstellen. Unabhängig davon, ob Sie sich den TIOBE-Index oder das IEEE Spectrum ansehen, werden Sie jedoch ein gemeinsames Thema feststellen.
Die Top 3 Sprachen sind immer C, Python und Java. Im TIOBE-Index für Juli 2021 steht C auf Platz 1, Java auf Platz 2 und Python auf Platz 3. Laut IEEE Spectrum's Ranking für eingebettete Programmiersprachen lautet die Reihenfolge: Python, Java, und dann C.
Wie unterscheidet sich in Java, C oder Python geschriebene Firmware?
Verschiedene Sprachen verwalten den Speicher, die Interaktion mit dem Betriebssystem und die Laufzeit auf unterschiedliche Weise. Java-Anwendungen werden z. B. in einer speziellen Laufzeitumgebung ausgeführt, die als Java Virtual Machine (JVM) bekannt ist.
Die Speicherverwaltung in C/C++ erfolgt manuell, während Sie sich in Java oder Python nicht selbst um die Speicherverwaltung kümmern müssen; die Sprache erledigt das für Sie. Hinzu kommt, dass Sie in C Ihren Müll selbst einsammeln müssen, d. h. wenn Sie einen Speicherbereich dynamisch zuweisen, müssen Sie ihn auch explizit wieder freigeben. Wenn Sie das nicht tun, führt das zu einem Speicherleck. In Java oder Python wird die Garbage Collection automatisch durchgeführt. Allerdings ist C von Natur aus viel schneller als Java oder Python.
Eine Sache, die C und Java (aber insbesondere C) im Vergleich zu Python fehlt, ist die Verfügbarkeit von Bibliotheken von Drittanbietern. Python verfügt über eine reichhaltigere Datenbank von Bibliotheken, die es Entwicklern viel einfacher macht, bestimmte Funktionen hinzuzufügen.
Insgesamt sollten Sie C wählen, wenn:
- Sie wollen eine Low-Level-Schnittstelle mit dem Betriebssystem und der Hardware.
- Sie wollen die bestmögliche Leistung.
- Ihre Entwickler sind in C/C++ bewandert.
- Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.
Verwenden Sie Python, wenn:
- Sie möchten datenwissenschaftliche oder maschinelle Lernalgorithmen implementieren.
- Sie möchten umfangreiche Unterstützung für Bibliotheken von Drittanbietern.
- Sie sind damit einverstanden, Geschwindigkeit gegen Benutzerfreundlichkeit einzutauschen.
- Sie haben nur begrenzte Erfahrung in der Embedded-Entwicklung.
- Sie brauchen keine Low-Level-Schnittstelle mit dem Betriebssystem oder der Hardware.
Verwenden Sie Java, wenn:
- Sie erstellen Webanwendungen.
- Sie wollen eine einfachere Entwicklung als in C, aber dennoch mehr Leistung als in Python.
- Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.
Wird C langsam aufhören, die erste Wahl für die Embedded-Entwicklung zu sein?
Hochsprachen erleichtern die Programmierung, indem sie die Komplexität, die sich in C einfach nicht vermeiden lässt, abstrahieren. Dennoch ist C trotz der Einführung neuer Sprachen und Frameworks seit Jahrzehnten die erste Wahl bei der Embedded-Entwicklung.
Der Grund dafür ist, dass die Geschwindigkeit, Leistung und Zuverlässigkeit, die sie bietet, immer noch unerreicht sind. Die Tatsache, dass Python und große Teile des Java-Ökosystems (einschließlich der Laufzeitumgebung, der Sprache und des Compilers) in C geschrieben sind, spricht Bände über die Effizienz und Beständigkeit der Sprache.
Allerdings ist C für neue Entwickler, die die Einfachheit von Sprachen wie Python bevorzugen, unbestreitbar schwieriger zu erlernen. Dies führt zu einem spürbaren Rückgang der C-Entwicklergemeinde. Auch die zunehmende Entwicklung von KI- und ML-Anwendungen führt dazu, dass die Menschen Python gegenüber C bevorzugen, einfach weil es eine größere Bibliotheksunterstützung bietet.
Es ist wichtig, daran zu denken, dass Python erst seit kurzem Teil der Debatte um die wichtigste Programmiersprache für Embedded-Systeme ist. Ja, seine Akzeptanz wird in den kommenden Jahren weiter steigen, aber wir erwarten nicht, dass C jemals aufhören wird, die erste Wahl für die Embedded-Entwicklung zu sein.
Warum sichere Kodierung in C/C++ wichtig ist
Beim Schreiben von Code in C/C++ kann eine Menge schief gehen. Der Zugriff auf eine Speicheradresse, die nicht mehr auf gültige Daten verweist, oder die falsche gemeinsame Nutzung von Daten zwischen Threads kann zum Absturz Ihrer gesamten Anwendung führen.
Bei eingebetteten Geräten sind diese Auswirkungen weitaus bedeutender, da ein Absturz in diesen Geräten dazu führen kann, dass eine viel größere Maschine nicht mehr funktioniert. Wenn z. B. das Autopilot-Modul in einem Auto ausfällt, kann das Auto Hindernissen nicht mehr ausweichen.
Hier sind weitere Gründe, warum die sichere Kodierung von C/C++-Anwendungen so wichtig ist:
- Unsichere Speicherbehandlung (Nullzeiger, Speicherverfälschung, Stapelüberläufe, Puffer- und Heap-Überläufe) führen zum Absturz der gesamten Anwendung.
- Zeiger sind ein fester Bestandteil von C und C++. Der Umgang mit ihnen erfordert äußerste Sorgfalt und tiefgreifende Kenntnisse der zugrunde liegenden Konzepte.
- Die Speicherbereinigung erfolgt manuell. Daher müssen Programmierer jeden dynamisch zugewiesenen Speicher explizit löschen. Nicht freigegebener oder nicht korrekt freigegebener Speicher kann zu Speicherlecks oder -beschädigung führen.
- Es fehlt an standardisierten APIs für fortgeschrittene Datenstrukturen (z. B. Hashtabellen, Mengen usw.), so dass die Entwickler gezwungen sind, das Rad neu zu erfinden.
Es ist absolut wichtig, dass Entwickler in der sicheren Programmierung von C/C++-Anwendungen geschult werden. Secure Code Warrior bietet eine personalisierte learning platform mit interaktiven Herausforderungen, courses und Bewertungen, die es Entwicklern ermöglichen, sicheren C/C++-Code zu schreiben. Hier geht es um sprachen- und rahmenspezifische Inhalte, nicht nur um eine Verbesserung der allgemeinen konzeptionellen Schulung.
Erfahren Sie, wie wir die Automobil- und Transportbranche unterstützen. Oder probieren Sie noch heute eine Embed-Focus-Coding-Challenge aus, um zu erfahren, wie wir Entwickler in die Lage versetzen, sichere Embedded-Anwendungen zu schreiben!
Auf Secure Code Warrior sind wir stets bestrebt, unser Schulungsangebot zu erweitern. Um Entwicklern und Sicherheitsverantwortlichen die Möglichkeit zu geben, sichere eingebettete Systeme zu entwickeln, haben wir uns in die Welt der Sicherheit eingebetteter Systeme eingearbeitet. In diesem Beitrag stellen wir die wichtigsten Dinge vor, die Entwickler und Architekten über die Entwicklung sicherer eingebetteter Systeme wissen sollten.
Ein eingebettetes Gerät ist eine unabhängige Recheneinheit mit eigener mikroprozessorbasierter Hardware und Software. Sie werden in der Regel zur Ausführung spezieller Funktionen verwendet, entweder unabhängig oder als Teil größerer Systeme.
Was ist ein eingebettetes Gerät und System?
Eingebettete Geräte sind zweckgebundene Computersysteme mit minimalistischer Hardware und Software, die für die Ausführung bestimmter Funktionen programmiert sind. Je nach ihrem Zweck können eingebettete Geräte unterschiedlich komplex sein.
Wenn ein eingebettetes System komplizierte, ressourcenintensive Operationen durchführen muss, kann seine Hardware aus mehreren Prozessoren mit verschiedenen miteinander verbundenen Peripheriegeräten bestehen. Wenn es jedoch für eine einfache Aufgabe konzipiert ist, kann es auch nur einen einzigen Mikrocontroller enthalten.
Einige eingebettete Systeme sind Blackboxes ohne Benutzeroberfläche, während andere detaillierte grafische Benutzeroberflächen haben können.
Beispiele für eingebettete Geräte
Eingebettete Geräte finden in zahlreichen Branchen Anwendung, von der Luft- und Raumfahrt bis zur Computerbranche und von Haushaltsgeräten bis zum Gesundheitswesen. Hier sind ein paar Beispiele:
- Ein Thermostat in einem Klimagerät.
- Ein Fitness-Tracker mit kleinen elektrischen Bauteilen, auf denen ein winziges Betriebssystem läuft, das nicht mehr kann als Ihre Gesundheitsdaten aufzuzeichnen und zu synchronisieren.
- Digitale Klimakontrollsysteme.
- Navigationssysteme in Flugzeugen.
- Digitale Uhren.
- GPS-Geräte.
- Wi-Fi-Komponenten in Mikrowellenherden und anderer Unterhaltungselektronik.
- Blutdruck- und Herzschlagmessgeräte.
- Vernetzungskomponente in einem MRT-Gerät, die Daten an die Cloud sendet.
Ist ein Laptop ein eingebettetes Gerät?
Kurze Antwort: Nein. Lange Antwort:
Per Definition umfasst ein eingebettetes Gerät die gesamte Software und Hardware, die es zur Ausführung seiner Funktionen benötigt. Ein Laptop verpackt in der Tat verschiedene Hardwarekomponenten in ein Metallgehäuse und umfasst die gesamte Software, die zur Bereitstellung seiner Funktionen erforderlich ist.
Im Gegensatz zu typischen eingebetteten Systemen, die einen vordefinierten, minimalen Funktionsumfang haben, ist ein Laptop jedoch universeller einsetzbar und kann für eine Vielzahl von Aktivitäten verwendet werden.
Eingebettete Geräte im Internet der Dinge
Eingebettete Systeme sind das Herzstück des IoT. Ihr intelligenter Kühlschrank kann dank eines eingebetteten Geräts über Ihr Mobilgerät gesteuert werden. Es ist ein eingebettetes Gerät in Ihrem Sicherheitssystem, mit dem Sie CCTV-Aufnahmen aus tausend Meilen Entfernung ansehen können. Und wenn Sie einen Knopf drücken, um Ihr Auto auf Autopilot zu stellen, ist es ein eingebettetes Gerät, das hinter den Kulissen die ganze Magie bewirkt.
Lebenszyklus der Entwicklung eingebetteter Software
Der typische Lebenszyklus der Softwareentwicklung eines eingebetteten Geräts umfasst die folgenden Schritte:
Schritt 1: Zweck und Anforderungen
Ein eingebettetes Gerät hat einen bestimmten und präzisen Funktionsumfang. Deshalb ist es sehr wichtig, seinen Zweck und seine Anforderungen vor Beginn der Entwicklung explizit zu formulieren. Es wird empfohlen, ein detailliertes Entwurfsdokument für das System zu erstellen. Beantworten Sie Fragen wie:
- Welche Funktionen wird das Gerät erfüllen?
- Wird sie ein Teil einer anderen Maschine sein, oder wird sie eigenständig funktionieren?
- Soll das Gerät über eine Benutzeroberfläche verfügen? Wenn ja, reicht eine Befehlszeile aus, oder ist eine grafische Benutzeroberfläche erforderlich?
- Welche Größen-, Kosten- oder Stromverbrauchsgrenzen muss das Gerät einhalten?
- Gibt es Leistungsmaßstäbe? Wird z. B. erwartet, dass das Gerät in Echtzeit oder innerhalb bestimmter Schwellenwerte reagiert?
Schritt 2: Systemarchitektur
Sobald wir die einzigartigen Systemanforderungen ermittelt haben, können wir die Systemarchitektur entwerfen. Beantworten Sie Fragen wie:
- Welche Hardwarekomponenten werden für die Entwicklung des Geräts benötigt? Dazu gehört die Identifizierung der Schaltkreise, Prozessorchips und Mikrocontroller sowie aller erforderlichen internen und externen Peripheriegeräte.
- Wie viel Strom werden die Komponenten benötigen?
- Wird das Gerät mit dem Internet verbunden sein?
- Welche Schnittstellen müssen hinzugefügt/entwickelt werden, damit das Gerät mit anderen Geräten oder der größeren Maschine verbunden werden kann?
- Wie werden Sie die Verschlüsselung umsetzen? (denken Sie an Algorithmen, Schlüsselspeicherung usw.)
- Wie werden Sie potenzielle Schwachstellen, Sicherheitslücken und Malware erkennen und vermeiden?
Schritt 3: Auswahl des Betriebssystems
Die Wahl des Betriebssystems entscheidet oft über die Effizienz Ihrer eingebetteten Anwendungen, also wählen Sie mit Bedacht. Windows für IoT kann bei der Grafik punkten, bietet aber keine Hardware-Unterstützung. Embedded Linux und Android sind kostenlos, während für VxWorks und Windows für IoT Lizenzkosten anfallen.
Bei Open-Source-Systemen wie Linux und Android haben die Entwickler mehr Kontrolle über den Kernel; bei proprietären Systemen hingegen können Sie nur mit den Standardfunktionen des Kernels arbeiten.
Es ist auch wichtig, bei der Auswahl eines Betriebssystems die Sicherheitsaspekte zu berücksichtigen. Werden Sicherheits-Patches schnell veröffentlicht, falls Sicherheitslücken entdeckt werden? Gibt es einen eingebauten Schutz gegen die häufigsten Angriffe auf die Cybersicherheit?
Schritt 4: Die Entwicklungswerkzeuge
Verschiedene Programmiersprachen und Frameworks haben verschiedene Vor- und Nachteile. Je nach Ihren Anforderungen an Funktionen, Geschwindigkeit und Zuverlässigkeit können Sie eine Sprache/ein Framework der anderen vorziehen.
Wenn Ihre Anwendung webbasiert ist und Sie eine hohe Leistung wünschen, wählen Sie Java.
Wenn Sie jedoch den schnellsten Durchsatz wünschen, wählen Sie C/C++. Wenn Sie die beste Unterstützung für Bibliotheken von Drittanbietern wünschen, sollten Sie sich für Python entscheiden.
Schritt 5: Programmieren, überarbeiten, testen, weiterprogrammieren
Sobald Sie sich für eine Entwicklungsplattform entschieden haben, können Sie mit dem Programmieren beginnen. Denken Sie daran, dass eingebettete Systeme empfindliche Geräte mit begrenzten Hardware- und Softwareressourcen sind. Daher ist es von entscheidender Bedeutung, die besten Praktiken in Bezug auf Anwendungssicherheit und Leistung zu beachten.
Code-Reviews helfen bei der Optimierung des Codes und bei der Identifizierung potenzieller Bugs. Außerdem müssen Sie so rigoros wie möglich testen. Stellen Sie sicher, dass Sie eine erschöpfende Liste aller Testfälle zusammenstellen, auf die das Gerät beim Einsatz in der Produktion stoßen könnte.
Schritt 6: Wartung und Unterstützung
Wie bei jeder anderen Anwendung/jedem anderen Gerät endet der Lebenszyklus nicht, wenn das eingebettete Gerät ausgeliefert und installiert wurde. Während das Gerät in der Produktion eingesetzt wird, werden neue Anwendungsfälle identifiziert, die das Hinzufügen neuer Funktionen erfordern. Gemeldete Fehler können auch die Veröffentlichung neuer Firmware-Updates erforderlich machen.
Die wichtigsten eingebetteten Programmiersprachen
Es gibt viele seriöse Organisationen wie IEEE und TIOBE, die eine Rangliste der Programmiersprachen nach Beliebtheit und Verwendung erstellen. Unabhängig davon, ob Sie sich den TIOBE-Index oder das IEEE Spectrum ansehen, werden Sie jedoch ein gemeinsames Thema feststellen.
Die Top 3 Sprachen sind immer C, Python und Java. Im TIOBE-Index für Juli 2021 steht C auf Platz 1, Java auf Platz 2 und Python auf Platz 3. Laut IEEE Spectrum's Ranking für eingebettete Programmiersprachen lautet die Reihenfolge: Python, Java, und dann C.
Wie unterscheidet sich in Java, C oder Python geschriebene Firmware?
Verschiedene Sprachen verwalten den Speicher, die Interaktion mit dem Betriebssystem und die Laufzeit auf unterschiedliche Weise. Java-Anwendungen werden z. B. in einer speziellen Laufzeitumgebung ausgeführt, die als Java Virtual Machine (JVM) bekannt ist.
Die Speicherverwaltung in C/C++ erfolgt manuell, während Sie sich in Java oder Python nicht selbst um die Speicherverwaltung kümmern müssen; die Sprache erledigt das für Sie. Hinzu kommt, dass Sie in C Ihren Müll selbst einsammeln müssen, d. h. wenn Sie einen Speicherbereich dynamisch zuweisen, müssen Sie ihn auch explizit wieder freigeben. Wenn Sie das nicht tun, führt das zu einem Speicherleck. In Java oder Python wird die Garbage Collection automatisch durchgeführt. Allerdings ist C von Natur aus viel schneller als Java oder Python.
Eine Sache, die C und Java (aber insbesondere C) im Vergleich zu Python fehlt, ist die Verfügbarkeit von Bibliotheken von Drittanbietern. Python verfügt über eine reichhaltigere Datenbank von Bibliotheken, die es Entwicklern viel einfacher macht, bestimmte Funktionen hinzuzufügen.
Insgesamt sollten Sie C wählen, wenn:
- Sie wollen eine Low-Level-Schnittstelle mit dem Betriebssystem und der Hardware.
- Sie wollen die bestmögliche Leistung.
- Ihre Entwickler sind in C/C++ bewandert.
- Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.
Verwenden Sie Python, wenn:
- Sie möchten datenwissenschaftliche oder maschinelle Lernalgorithmen implementieren.
- Sie möchten umfangreiche Unterstützung für Bibliotheken von Drittanbietern.
- Sie sind damit einverstanden, Geschwindigkeit gegen Benutzerfreundlichkeit einzutauschen.
- Sie haben nur begrenzte Erfahrung in der Embedded-Entwicklung.
- Sie brauchen keine Low-Level-Schnittstelle mit dem Betriebssystem oder der Hardware.
Verwenden Sie Java, wenn:
- Sie erstellen Webanwendungen.
- Sie wollen eine einfachere Entwicklung als in C, aber dennoch mehr Leistung als in Python.
- Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.
Wird C langsam aufhören, die erste Wahl für die Embedded-Entwicklung zu sein?
Hochsprachen erleichtern die Programmierung, indem sie die Komplexität, die sich in C einfach nicht vermeiden lässt, abstrahieren. Dennoch ist C trotz der Einführung neuer Sprachen und Frameworks seit Jahrzehnten die erste Wahl bei der Embedded-Entwicklung.
Der Grund dafür ist, dass die Geschwindigkeit, Leistung und Zuverlässigkeit, die sie bietet, immer noch unerreicht sind. Die Tatsache, dass Python und große Teile des Java-Ökosystems (einschließlich der Laufzeitumgebung, der Sprache und des Compilers) in C geschrieben sind, spricht Bände über die Effizienz und Beständigkeit der Sprache.
Allerdings ist C für neue Entwickler, die die Einfachheit von Sprachen wie Python bevorzugen, unbestreitbar schwieriger zu erlernen. Dies führt zu einem spürbaren Rückgang der C-Entwicklergemeinde. Auch die zunehmende Entwicklung von KI- und ML-Anwendungen führt dazu, dass die Menschen Python gegenüber C bevorzugen, einfach weil es eine größere Bibliotheksunterstützung bietet.
Es ist wichtig, daran zu denken, dass Python erst seit kurzem Teil der Debatte um die wichtigste Programmiersprache für Embedded-Systeme ist. Ja, seine Akzeptanz wird in den kommenden Jahren weiter steigen, aber wir erwarten nicht, dass C jemals aufhören wird, die erste Wahl für die Embedded-Entwicklung zu sein.
Warum sichere Kodierung in C/C++ wichtig ist
Beim Schreiben von Code in C/C++ kann eine Menge schief gehen. Der Zugriff auf eine Speicheradresse, die nicht mehr auf gültige Daten verweist, oder die falsche gemeinsame Nutzung von Daten zwischen Threads kann zum Absturz Ihrer gesamten Anwendung führen.
Bei eingebetteten Geräten sind diese Auswirkungen weitaus bedeutender, da ein Absturz in diesen Geräten dazu führen kann, dass eine viel größere Maschine nicht mehr funktioniert. Wenn z. B. das Autopilot-Modul in einem Auto ausfällt, kann das Auto Hindernissen nicht mehr ausweichen.
Hier sind weitere Gründe, warum die sichere Kodierung von C/C++-Anwendungen so wichtig ist:
- Unsichere Speicherbehandlung (Nullzeiger, Speicherverfälschung, Stapelüberläufe, Puffer- und Heap-Überläufe) führen zum Absturz der gesamten Anwendung.
- Zeiger sind ein fester Bestandteil von C und C++. Der Umgang mit ihnen erfordert äußerste Sorgfalt und tiefgreifende Kenntnisse der zugrunde liegenden Konzepte.
- Die Speicherbereinigung erfolgt manuell. Daher müssen Programmierer jeden dynamisch zugewiesenen Speicher explizit löschen. Nicht freigegebener oder nicht korrekt freigegebener Speicher kann zu Speicherlecks oder -beschädigung führen.
- Es fehlt an standardisierten APIs für fortgeschrittene Datenstrukturen (z. B. Hashtabellen, Mengen usw.), so dass die Entwickler gezwungen sind, das Rad neu zu erfinden.
Es ist absolut wichtig, dass Entwickler in der sicheren Programmierung von C/C++-Anwendungen geschult werden. Secure Code Warrior bietet eine personalisierte learning platform mit interaktiven Herausforderungen, courses und Bewertungen, die es Entwicklern ermöglichen, sicheren C/C++-Code zu schreiben. Hier geht es um sprachen- und rahmenspezifische Inhalte, nicht nur um eine Verbesserung der allgemeinen konzeptionellen Schulung.
Erfahren Sie, wie wir die Automobil- und Transportbranche unterstützen. Oder probieren Sie noch heute eine Embed-Focus-Coding-Challenge aus, um zu erfahren, wie wir Entwickler in die Lage versetzen, sichere Embedded-Anwendungen zu schreiben!
Klicken Sie auf den unten stehenden Link und laden Sie die PDF-Datei dieser Ressource herunter.
Secure Code Warrior ist für Ihr Unternehmen da, um Sie dabei zu unterstützen, Ihren Code über den gesamten Lebenszyklus der Softwareentwicklung hinweg zu sichern und eine Kultur zu schaffen, in der Cybersicherheit an erster Stelle steht. Ganz gleich, ob Sie AppSec-Manager, Entwickler, CISO oder ein anderer Sicherheitsverantwortlicher sind, wir können Ihrem Unternehmen helfen, die mit unsicherem Code verbundenen Risiken zu reduzieren.
Bericht ansehenDemo buchenSecure Code Warrior macht sicheres Programmieren zu einer positiven und fesselnden Erfahrung für Entwickler, die ihre Fähigkeiten ausbauen. Wir leiten jeden Programmierer auf seinem bevorzugten Lernpfad an, damit sicherheitskompetente Entwickler zu den täglichen Superhelden unserer vernetzten Welt werden.
Secure Code Warrior baut eine Kultur von sicherheitsorientierten Entwicklern auf, indem es ihnen die Fähigkeiten vermittelt, sicher zu programmieren. Unser Flaggschiff Agile Learning Platform bietet relevante fähigkeitsbasierte Pfade, praktische Übungen missions und kontextbezogene Tools, mit denen Entwickler ihre Fähigkeiten zum Schreiben von sicherem Code schnell erlernen, aufbauen und anwenden können.
Auf Secure Code Warrior sind wir stets bestrebt, unser Schulungsangebot zu erweitern. Um Entwicklern und Sicherheitsverantwortlichen die Möglichkeit zu geben, sichere eingebettete Systeme zu entwickeln, haben wir uns in die Welt der Sicherheit eingebetteter Systeme eingearbeitet. In diesem Beitrag stellen wir die wichtigsten Dinge vor, die Entwickler und Architekten über die Entwicklung sicherer eingebetteter Systeme wissen sollten.
Ein eingebettetes Gerät ist eine unabhängige Recheneinheit mit eigener mikroprozessorbasierter Hardware und Software. Sie werden in der Regel zur Ausführung spezieller Funktionen verwendet, entweder unabhängig oder als Teil größerer Systeme.
Was ist ein eingebettetes Gerät und System?
Eingebettete Geräte sind zweckgebundene Computersysteme mit minimalistischer Hardware und Software, die für die Ausführung bestimmter Funktionen programmiert sind. Je nach ihrem Zweck können eingebettete Geräte unterschiedlich komplex sein.
Wenn ein eingebettetes System komplizierte, ressourcenintensive Operationen durchführen muss, kann seine Hardware aus mehreren Prozessoren mit verschiedenen miteinander verbundenen Peripheriegeräten bestehen. Wenn es jedoch für eine einfache Aufgabe konzipiert ist, kann es auch nur einen einzigen Mikrocontroller enthalten.
Einige eingebettete Systeme sind Blackboxes ohne Benutzeroberfläche, während andere detaillierte grafische Benutzeroberflächen haben können.
Beispiele für eingebettete Geräte
Eingebettete Geräte finden in zahlreichen Branchen Anwendung, von der Luft- und Raumfahrt bis zur Computerbranche und von Haushaltsgeräten bis zum Gesundheitswesen. Hier sind ein paar Beispiele:
- Ein Thermostat in einem Klimagerät.
- Ein Fitness-Tracker mit kleinen elektrischen Bauteilen, auf denen ein winziges Betriebssystem läuft, das nicht mehr kann als Ihre Gesundheitsdaten aufzuzeichnen und zu synchronisieren.
- Digitale Klimakontrollsysteme.
- Navigationssysteme in Flugzeugen.
- Digitale Uhren.
- GPS-Geräte.
- Wi-Fi-Komponenten in Mikrowellenherden und anderer Unterhaltungselektronik.
- Blutdruck- und Herzschlagmessgeräte.
- Vernetzungskomponente in einem MRT-Gerät, die Daten an die Cloud sendet.
Ist ein Laptop ein eingebettetes Gerät?
Kurze Antwort: Nein. Lange Antwort:
Per Definition umfasst ein eingebettetes Gerät die gesamte Software und Hardware, die es zur Ausführung seiner Funktionen benötigt. Ein Laptop verpackt in der Tat verschiedene Hardwarekomponenten in ein Metallgehäuse und umfasst die gesamte Software, die zur Bereitstellung seiner Funktionen erforderlich ist.
Im Gegensatz zu typischen eingebetteten Systemen, die einen vordefinierten, minimalen Funktionsumfang haben, ist ein Laptop jedoch universeller einsetzbar und kann für eine Vielzahl von Aktivitäten verwendet werden.
Eingebettete Geräte im Internet der Dinge
Eingebettete Systeme sind das Herzstück des IoT. Ihr intelligenter Kühlschrank kann dank eines eingebetteten Geräts über Ihr Mobilgerät gesteuert werden. Es ist ein eingebettetes Gerät in Ihrem Sicherheitssystem, mit dem Sie CCTV-Aufnahmen aus tausend Meilen Entfernung ansehen können. Und wenn Sie einen Knopf drücken, um Ihr Auto auf Autopilot zu stellen, ist es ein eingebettetes Gerät, das hinter den Kulissen die ganze Magie bewirkt.
Lebenszyklus der Entwicklung eingebetteter Software
Der typische Lebenszyklus der Softwareentwicklung eines eingebetteten Geräts umfasst die folgenden Schritte:
Schritt 1: Zweck und Anforderungen
Ein eingebettetes Gerät hat einen bestimmten und präzisen Funktionsumfang. Deshalb ist es sehr wichtig, seinen Zweck und seine Anforderungen vor Beginn der Entwicklung explizit zu formulieren. Es wird empfohlen, ein detailliertes Entwurfsdokument für das System zu erstellen. Beantworten Sie Fragen wie:
- Welche Funktionen wird das Gerät erfüllen?
- Wird sie ein Teil einer anderen Maschine sein, oder wird sie eigenständig funktionieren?
- Soll das Gerät über eine Benutzeroberfläche verfügen? Wenn ja, reicht eine Befehlszeile aus, oder ist eine grafische Benutzeroberfläche erforderlich?
- Welche Größen-, Kosten- oder Stromverbrauchsgrenzen muss das Gerät einhalten?
- Gibt es Leistungsmaßstäbe? Wird z. B. erwartet, dass das Gerät in Echtzeit oder innerhalb bestimmter Schwellenwerte reagiert?
Schritt 2: Systemarchitektur
Sobald wir die einzigartigen Systemanforderungen ermittelt haben, können wir die Systemarchitektur entwerfen. Beantworten Sie Fragen wie:
- Welche Hardwarekomponenten werden für die Entwicklung des Geräts benötigt? Dazu gehört die Identifizierung der Schaltkreise, Prozessorchips und Mikrocontroller sowie aller erforderlichen internen und externen Peripheriegeräte.
- Wie viel Strom werden die Komponenten benötigen?
- Wird das Gerät mit dem Internet verbunden sein?
- Welche Schnittstellen müssen hinzugefügt/entwickelt werden, damit das Gerät mit anderen Geräten oder der größeren Maschine verbunden werden kann?
- Wie werden Sie die Verschlüsselung umsetzen? (denken Sie an Algorithmen, Schlüsselspeicherung usw.)
- Wie werden Sie potenzielle Schwachstellen, Sicherheitslücken und Malware erkennen und vermeiden?
Schritt 3: Auswahl des Betriebssystems
Die Wahl des Betriebssystems entscheidet oft über die Effizienz Ihrer eingebetteten Anwendungen, also wählen Sie mit Bedacht. Windows für IoT kann bei der Grafik punkten, bietet aber keine Hardware-Unterstützung. Embedded Linux und Android sind kostenlos, während für VxWorks und Windows für IoT Lizenzkosten anfallen.
Bei Open-Source-Systemen wie Linux und Android haben die Entwickler mehr Kontrolle über den Kernel; bei proprietären Systemen hingegen können Sie nur mit den Standardfunktionen des Kernels arbeiten.
Es ist auch wichtig, bei der Auswahl eines Betriebssystems die Sicherheitsaspekte zu berücksichtigen. Werden Sicherheits-Patches schnell veröffentlicht, falls Sicherheitslücken entdeckt werden? Gibt es einen eingebauten Schutz gegen die häufigsten Angriffe auf die Cybersicherheit?
Schritt 4: Die Entwicklungswerkzeuge
Verschiedene Programmiersprachen und Frameworks haben verschiedene Vor- und Nachteile. Je nach Ihren Anforderungen an Funktionen, Geschwindigkeit und Zuverlässigkeit können Sie eine Sprache/ein Framework der anderen vorziehen.
Wenn Ihre Anwendung webbasiert ist und Sie eine hohe Leistung wünschen, wählen Sie Java.
Wenn Sie jedoch den schnellsten Durchsatz wünschen, wählen Sie C/C++. Wenn Sie die beste Unterstützung für Bibliotheken von Drittanbietern wünschen, sollten Sie sich für Python entscheiden.
Schritt 5: Programmieren, überarbeiten, testen, weiterprogrammieren
Sobald Sie sich für eine Entwicklungsplattform entschieden haben, können Sie mit dem Programmieren beginnen. Denken Sie daran, dass eingebettete Systeme empfindliche Geräte mit begrenzten Hardware- und Softwareressourcen sind. Daher ist es von entscheidender Bedeutung, die besten Praktiken in Bezug auf Anwendungssicherheit und Leistung zu beachten.
Code-Reviews helfen bei der Optimierung des Codes und bei der Identifizierung potenzieller Bugs. Außerdem müssen Sie so rigoros wie möglich testen. Stellen Sie sicher, dass Sie eine erschöpfende Liste aller Testfälle zusammenstellen, auf die das Gerät beim Einsatz in der Produktion stoßen könnte.
Schritt 6: Wartung und Unterstützung
Wie bei jeder anderen Anwendung/jedem anderen Gerät endet der Lebenszyklus nicht, wenn das eingebettete Gerät ausgeliefert und installiert wurde. Während das Gerät in der Produktion eingesetzt wird, werden neue Anwendungsfälle identifiziert, die das Hinzufügen neuer Funktionen erfordern. Gemeldete Fehler können auch die Veröffentlichung neuer Firmware-Updates erforderlich machen.
Die wichtigsten eingebetteten Programmiersprachen
Es gibt viele seriöse Organisationen wie IEEE und TIOBE, die eine Rangliste der Programmiersprachen nach Beliebtheit und Verwendung erstellen. Unabhängig davon, ob Sie sich den TIOBE-Index oder das IEEE Spectrum ansehen, werden Sie jedoch ein gemeinsames Thema feststellen.
Die Top 3 Sprachen sind immer C, Python und Java. Im TIOBE-Index für Juli 2021 steht C auf Platz 1, Java auf Platz 2 und Python auf Platz 3. Laut IEEE Spectrum's Ranking für eingebettete Programmiersprachen lautet die Reihenfolge: Python, Java, und dann C.
Wie unterscheidet sich in Java, C oder Python geschriebene Firmware?
Verschiedene Sprachen verwalten den Speicher, die Interaktion mit dem Betriebssystem und die Laufzeit auf unterschiedliche Weise. Java-Anwendungen werden z. B. in einer speziellen Laufzeitumgebung ausgeführt, die als Java Virtual Machine (JVM) bekannt ist.
Die Speicherverwaltung in C/C++ erfolgt manuell, während Sie sich in Java oder Python nicht selbst um die Speicherverwaltung kümmern müssen; die Sprache erledigt das für Sie. Hinzu kommt, dass Sie in C Ihren Müll selbst einsammeln müssen, d. h. wenn Sie einen Speicherbereich dynamisch zuweisen, müssen Sie ihn auch explizit wieder freigeben. Wenn Sie das nicht tun, führt das zu einem Speicherleck. In Java oder Python wird die Garbage Collection automatisch durchgeführt. Allerdings ist C von Natur aus viel schneller als Java oder Python.
Eine Sache, die C und Java (aber insbesondere C) im Vergleich zu Python fehlt, ist die Verfügbarkeit von Bibliotheken von Drittanbietern. Python verfügt über eine reichhaltigere Datenbank von Bibliotheken, die es Entwicklern viel einfacher macht, bestimmte Funktionen hinzuzufügen.
Insgesamt sollten Sie C wählen, wenn:
- Sie wollen eine Low-Level-Schnittstelle mit dem Betriebssystem und der Hardware.
- Sie wollen die bestmögliche Leistung.
- Ihre Entwickler sind in C/C++ bewandert.
- Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.
Verwenden Sie Python, wenn:
- Sie möchten datenwissenschaftliche oder maschinelle Lernalgorithmen implementieren.
- Sie möchten umfangreiche Unterstützung für Bibliotheken von Drittanbietern.
- Sie sind damit einverstanden, Geschwindigkeit gegen Benutzerfreundlichkeit einzutauschen.
- Sie haben nur begrenzte Erfahrung in der Embedded-Entwicklung.
- Sie brauchen keine Low-Level-Schnittstelle mit dem Betriebssystem oder der Hardware.
Verwenden Sie Java, wenn:
- Sie erstellen Webanwendungen.
- Sie wollen eine einfachere Entwicklung als in C, aber dennoch mehr Leistung als in Python.
- Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.
Wird C langsam aufhören, die erste Wahl für die Embedded-Entwicklung zu sein?
Hochsprachen erleichtern die Programmierung, indem sie die Komplexität, die sich in C einfach nicht vermeiden lässt, abstrahieren. Dennoch ist C trotz der Einführung neuer Sprachen und Frameworks seit Jahrzehnten die erste Wahl bei der Embedded-Entwicklung.
Der Grund dafür ist, dass die Geschwindigkeit, Leistung und Zuverlässigkeit, die sie bietet, immer noch unerreicht sind. Die Tatsache, dass Python und große Teile des Java-Ökosystems (einschließlich der Laufzeitumgebung, der Sprache und des Compilers) in C geschrieben sind, spricht Bände über die Effizienz und Beständigkeit der Sprache.
Allerdings ist C für neue Entwickler, die die Einfachheit von Sprachen wie Python bevorzugen, unbestreitbar schwieriger zu erlernen. Dies führt zu einem spürbaren Rückgang der C-Entwicklergemeinde. Auch die zunehmende Entwicklung von KI- und ML-Anwendungen führt dazu, dass die Menschen Python gegenüber C bevorzugen, einfach weil es eine größere Bibliotheksunterstützung bietet.
Es ist wichtig, daran zu denken, dass Python erst seit kurzem Teil der Debatte um die wichtigste Programmiersprache für Embedded-Systeme ist. Ja, seine Akzeptanz wird in den kommenden Jahren weiter steigen, aber wir erwarten nicht, dass C jemals aufhören wird, die erste Wahl für die Embedded-Entwicklung zu sein.
Warum sichere Kodierung in C/C++ wichtig ist
Beim Schreiben von Code in C/C++ kann eine Menge schief gehen. Der Zugriff auf eine Speicheradresse, die nicht mehr auf gültige Daten verweist, oder die falsche gemeinsame Nutzung von Daten zwischen Threads kann zum Absturz Ihrer gesamten Anwendung führen.
Bei eingebetteten Geräten sind diese Auswirkungen weitaus bedeutender, da ein Absturz in diesen Geräten dazu führen kann, dass eine viel größere Maschine nicht mehr funktioniert. Wenn z. B. das Autopilot-Modul in einem Auto ausfällt, kann das Auto Hindernissen nicht mehr ausweichen.
Hier sind weitere Gründe, warum die sichere Kodierung von C/C++-Anwendungen so wichtig ist:
- Unsichere Speicherbehandlung (Nullzeiger, Speicherverfälschung, Stapelüberläufe, Puffer- und Heap-Überläufe) führen zum Absturz der gesamten Anwendung.
- Zeiger sind ein fester Bestandteil von C und C++. Der Umgang mit ihnen erfordert äußerste Sorgfalt und tiefgreifende Kenntnisse der zugrunde liegenden Konzepte.
- Die Speicherbereinigung erfolgt manuell. Daher müssen Programmierer jeden dynamisch zugewiesenen Speicher explizit löschen. Nicht freigegebener oder nicht korrekt freigegebener Speicher kann zu Speicherlecks oder -beschädigung führen.
- Es fehlt an standardisierten APIs für fortgeschrittene Datenstrukturen (z. B. Hashtabellen, Mengen usw.), so dass die Entwickler gezwungen sind, das Rad neu zu erfinden.
Es ist absolut wichtig, dass Entwickler in der sicheren Programmierung von C/C++-Anwendungen geschult werden. Secure Code Warrior bietet eine personalisierte learning platform mit interaktiven Herausforderungen, courses und Bewertungen, die es Entwicklern ermöglichen, sicheren C/C++-Code zu schreiben. Hier geht es um sprachen- und rahmenspezifische Inhalte, nicht nur um eine Verbesserung der allgemeinen konzeptionellen Schulung.
Erfahren Sie, wie wir die Automobil- und Transportbranche unterstützen. Oder probieren Sie noch heute eine Embed-Focus-Coding-Challenge aus, um zu erfahren, wie wir Entwickler in die Lage versetzen, sichere Embedded-Anwendungen zu schreiben!
Inhaltsübersicht
Secure Code Warrior macht sicheres Programmieren zu einer positiven und fesselnden Erfahrung für Entwickler, die ihre Fähigkeiten ausbauen. Wir leiten jeden Programmierer auf seinem bevorzugten Lernpfad an, damit sicherheitskompetente Entwickler zu den täglichen Superhelden unserer vernetzten Welt werden.
Secure Code Warrior ist für Ihr Unternehmen da, um Sie dabei zu unterstützen, Ihren Code über den gesamten Lebenszyklus der Softwareentwicklung hinweg zu sichern und eine Kultur zu schaffen, in der Cybersicherheit an erster Stelle steht. Ganz gleich, ob Sie AppSec-Manager, Entwickler, CISO oder ein anderer Sicherheitsverantwortlicher sind, wir können Ihrem Unternehmen helfen, die mit unsicherem Code verbundenen Risiken zu reduzieren.
Demo buchenHerunterladenRessourcen für den Einstieg
Benchmarking von Sicherheitskompetenzen: Optimierung von Secure-by-Design im Unternehmen
Die Secure-by-Design-Bewegung ist die Zukunft der sicheren Softwareentwicklung. Erfahren Sie mehr über die wichtigsten Elemente, die Unternehmen berücksichtigen müssen, wenn sie über eine Secure-by-Design-Initiative nachdenken.
DigitalOcean verringert Sicherheitsverschuldung mit Secure Code Warrior
DigitalOceans Einsatz von Secure Code Warrior hat die Sicherheitsverschuldung deutlich reduziert, so dass sich die Teams stärker auf Innovation und Produktivität konzentrieren können. Die verbesserte Sicherheit hat die Produktqualität und den Wettbewerbsvorteil des Unternehmens gestärkt. Mit Blick auf die Zukunft wird der SCW Trust Score dem Unternehmen helfen, seine Sicherheitspraktiken weiter zu verbessern und Innovationen voranzutreiben.
Ressourcen für den Einstieg
Trust Score zeigt den Wert von Secure-by-Design-Upskilling-Initiativen
Unsere Forschung hat gezeigt, dass Schulungen für sicheren Code funktionieren. Trust Score verwendet einen Algorithmus, der auf mehr als 20 Millionen Lerndaten aus der Arbeit von mehr als 250.000 Lernenden in über 600 Organisationen basiert, und zeigt, wie effektiv die Initiative ist, um Schwachstellen zu beseitigen und wie man sie noch effektiver gestalten kann.
Reaktive versus präventive Sicherheit: Prävention ist das bessere Heilmittel
Der Gedanke, Legacy-Code und -Systeme zur gleichen Zeit wie neuere Anwendungen mit präventiver Sicherheit auszustatten, kann entmutigend erscheinen, aber ein Secure-by-Design-Ansatz, der durch die Weiterbildung von Entwicklern durchgesetzt wird, kann die besten Sicherheitsverfahren auf diese Systeme anwenden. Dies ist für viele Unternehmen die beste Chance, ihre Sicherheitslage zu verbessern.
Die Vorteile eines Benchmarking der Sicherheitskompetenzen von Entwicklern
Der zunehmende Fokus auf sicheren Code und Secure-by-Design-Prinzipien erfordert, dass Entwickler von Beginn des SDLC an in Cybersicherheit geschult werden, wobei Tools wie Secure Code Warrior's Trust Score dabei helfen, ihre Fortschritte zu messen und zu verbessern.
Wesentlicher Erfolg für Enterprise Secure-by-Design-Initiativen
Unser jüngstes Forschungspapier „Benchmarking Security Skills: Streamlining Secure-by-Design in the Enterprise“ ist das Ergebnis einer umfassenden Analyse echter Secure-by-Design-Initiativen auf Unternehmensebene und der Ableitung von Best-Practice-Ansätzen auf Grundlage datengesteuerter Erkenntnisse.