Unterschiede: 1. Uclinux verwendet die Paging-Verwaltung des Speichers, während Linux die virtuelle Speicherverwaltung verwendet. 2. Uclinux verfügt nicht über einen Fork-Systemaufruf und verwendet vfork, während Linux einen Fork-Systemaufruf verwendet während es ausgeführt wird, während Linux den Prozessstapel zur Laufzeit erhöhen kann.
Die Betriebsumgebung dieses Tutorials: Linux7.3-System, Dell G3-Computer.
Im englischen Wort uClinux bedeutet u Micro, was klein bedeutet, und C bedeutet Control, was Kontrolle bedeutet
UClinux ist also Micro-Control-Linux, was wörtlich „klein“ bedeutet. Ein Linux-System, das für den Mikrosteuerungsbereich entwickelt wurde.
Der Unterschied zwischen ucLinux und Linux flach
Vorgänge ohne Speicherschutz
(Memory Protection) führen zu folgenden Ergebnissen:Kein virtueller Speicher
(Virtual Memory) führt vor allem zu folgenden Konsequenzen: Zunächst müssen vom Kernel geladene Prozesse unabhängig von ihrem Speicherort unabhängig laufen können. Die erste Möglichkeit, dies zu erreichen, besteht darin, die Basisadresse des Programms zu „fixieren“, sobald es in den RAM geladen wird. Eine andere Möglichkeit besteht darin, Code zu generieren, der nur relative Adressierung verwendet (sogenannter „positionsunabhängiger Code“, kurz: Positionsunabhängiger Code). Bild). uClinux unterstützt beide Modi. Zweitens müssen wir das Problem der Speicherzuweisung und -freigabe im Flat-Memory-Modell lösen. Eine sehr dynamische Speicherzuweisung kann zu einer Speicherfragmentierung führen und die Systemressourcen erschöpfen. Für Anwendungen, die dynamische Speicherzuweisung verwenden, besteht eine Möglichkeit zur Erhöhung der Robustheit darin, malloc()-Aufrufe durch einen vorab zugewiesenen Pufferpool zu ersetzen. Da in uclinux kein virtueller Speicher verwendet wird, ist das Auslagern von Seiten in den Speicher und aus dem Speicher nicht implementiert, da keine Garantie dafür besteht, dass die Seite an derselben Stelle im RAM geladen wird. Auf normalen Computern ermöglicht das Betriebssystem, dass Anwendungen mehr Speicherplatz als den physischen Speicher (RAM) nutzen, was häufig durch die Einrichtung einer Swap-Partition auf der Festplatte erreicht wird. In eingebetteten Systemen wird jedoch normalerweise FLASH-Speicher anstelle der Festplatte verwendet, und es ist schwierig, den Zugriff auf den Speicherseitenaustausch effizient zu implementieren. Daher ist der zuweisbare Speicherplatz für laufende Anwendungen auf nicht mehr als den RAM-Speicherplatz des Systems beschränkt.Multitasking ist nicht betroffen
. Welche alten Netzwerk-Daemons (Daemons), die fork() häufig verwenden, müssen geändert werden. Da der untergeordnete Prozess im selben Adressraum wie der übergeordnete Prozess läuft, ist es in manchen Fällen auch erforderlich, das Verhalten beider Prozesse zu ändern. Viele moderne Programme verlassen sich auf untergeordnete Prozesse, um grundlegende Aufgaben auszuführen, sodass das System auch dann in einem „interaktiven“ Zustand bleibt, wenn der Prozess unter hoher Auslastung steht. Unter uClinux sind möglicherweise erhebliche Änderungen erforderlich. Wenn eine kritische Anwendung stark auf eine solche Struktur angewiesen wäre, müsste sie neu geschrieben werden.Angenommen, es gibt einen einfachen Netzwerk-Daemon, der fork() ausgiebig nutzt. Dieser Daemon lauscht an einem bekannten Port (oder Socket) und wartet darauf, dass Netzwerkclients eine Verbindung herstellen. Wenn der Client eine Verbindung herstellt, gibt ihm der Daemon neue Verbindungsinformationen (neue Socket-Nummer) und ruft fork() auf. Der untergeordnete Prozess stellt dann über den neuen Socket eine Verbindung zum Client her, und der übergeordnete Prozess wird freigegeben und kann weiterhin auf neue Verbindungen warten.
uClinux verfügt weder über einen automatisch wachsenden Stack noch über eine brk()-Funktion, daher müssen User-Space-Programme den Befehl mmap() verwenden, um Speicher zuzuweisen. Der Einfachheit halber ist malloc(), das in der C-Sprachbibliothek von uclinux implementiert ist, im Wesentlichen ein mmap(). Zur Kompilierungszeit können Sie die Stapelgröße Ihres Programms angeben.
Schließlich fehlt dem uClinux-Zielplatinenprozessor eine Speicherverwaltungs-Hardwareeinheit, was einige Änderungen an der Linux-Systemschnittstelle erfordert. Der wahrscheinlich größte Unterschied besteht darin, dass es keine Systemaufrufe fork() und brk() gibt. Durch den Aufruf von fork() wird der Prozess kopiert, um einen untergeordneten Prozess zu erstellen. Unter Linux wird fork() mithilfe von Copy-on-Write-Seiten implementiert. Da es keine MMU gibt, kann Uclinux einen Prozess nicht vollständig und reproduzierbar kopieren und es gibt keinen Zugriff auf Copy-on-Write. Um diesen Mangel auszugleichen, implementiert uClinux vfork(), um einen untergeordneten Prozess zu erstellen, teilen sich die beiden Prozesse ihren gesamten Speicherplatz, einschließlich des Stapels. Der untergeordnete Prozess wird entweder anstelle des übergeordneten Prozesses ausgeführt (der übergeordnete Prozess befindet sich zu diesem Zeitpunkt bereits im Ruhezustand), bis der untergeordnete Prozess zum Beenden exitI() aufruft, oder er ruft exec() auf, um einen neuen Prozess auszuführen. Zu diesem Zeitpunkt wird die ausführbare Datei gelöscht wird geladen. Selbst wenn der Prozess nur eine Kopie des übergeordneten Prozesses ist, kann dieser Prozess nicht vermieden werden. Wenn der untergeordnete Prozess exit() oder exec() ausführt, aktiviert der untergeordnete Prozess den übergeordneten Prozess mithilfe von Wakeup und der übergeordnete Prozess setzt die Ausführung fort.
Kerneländerungen in der allgemeinen Architektur:
In der Veröffentlichung von uCLinux ersetzte das Verzeichnis /linux/mmnommu das Verzeichnis /linux/mm. Ersteres ist ein modifiziertes Speicherverwaltungssubsystem, das die Hardwareabhängigkeit der MMU entfernt und hinzugefügt hat Die Kernel-Software selbst stellt grundlegende interne Verwaltungsfunktionen bereit.
Die Kernel- und Benutzerspeicherzuweisungs- und -freigabeprozesse müssen neu implementiert werden, und die Unterstützung für transparente Interaktion/Paging wird ebenfalls entfernt. fügte ein Programmunterstützungsmodul zur Unterstützung von „kernelunabhängigem Code (PIC)“ hinzu und verwendete ein neues binäres Objektcodeformat, das sogenannte Flat-Format, um PIC zu unterstützen (mit einem sehr kompakten Header
Der Kernel unterstützt auch das ELF-Format). Programmlademodul zur Unterstützung ausführbarer Programme mit festen Basisadressen. Der herkömmliche PIC läuft schnell und verfügt über kompakte Codes, weist jedoch beispielsweise Einschränkungen bei der Codegröße auf Architektur Jump begrenzt die Größe von PIC-Programmen auf nicht mehr als 32 KB. Programmcodes, die während der Laufzeit unter Verwendung einer festen Basisadresse aufgelistet werden, haben keine Größenbeschränkung. Wenn Chen Xu jedoch vom Kernel geladen wird, verursacht dies einen höheren Systemaufwand Entwickler sagen, dass sich uCLinux grundsätzlich nicht von Linux unterscheidet. Der einzige Unterschied besteht darin, dass es die von MMU bereitgestellte Speicherverwaltung nicht nutzen kann. Tatsächlich hat dies keine Auswirkungen auf den Kernel uCLinux, da dieses Format auch einige Funktionen des virtuellen Speichers verwendet. Das flache Format ist ein prägnantes und effizientes ausführbares Dateiformat. Es enthält ausführbare Dateien sowie einige ausführbare Dateien
Zusammenfassung: Beim Portieren der Anwendung auf uClinux und beim Schreiben des Codes konzentrieren wir uns immer auf diese Funktionen:
1 Wenn möglich, müssen Sie „Deaktivieren“ auswählen -shared und -enable-static bei der Konfiguration.
2. Ändern Sie alle fork()-Vorkommen im Quellcode Linkoptionen. Auch wenn dies nur eine Verknüpfungsoption ist, achte ich darauf, diese Option in LDFLAGS und CFLAGS und sogar in CC anzugeben.
Empfohlenes Lernen:
Linux-Video-TutorialDas obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen Uclinux und Linux?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!