Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Was ist der Unterschied zwischen Uclinux und Linux?

Was ist der Unterschied zwischen Uclinux und Linux?

WBOY
WBOYOriginal
2022-05-17 11:02:504034Durchsuche

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.

Was ist der Unterschied zwischen Uclinux und Linux?

Die Betriebsumgebung dieses Tutorials: Linux7.3-System, Dell G3-Computer.

Was ist der Unterschied zwischen uclinux und linux

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

  • Sie können fork nicht verwenden, aber vfork verwenden

  • RAMDISK

  • uClinux ist ein eingebettetes Linux-Betriebssystem für den Steuerungsbereich. Es ist vom Linux 2.0/2.4-Kernel abgeleitet und erbt die meisten Funktionen von Mainstream-Linux.

    Geeignet für Mikroprozessoren/Mikrocontroller, die keine Memory Management Unit (MMU) haben. Die fehlende MMU-Unterstützung ist der grundlegende Unterschied zwischen uClinux und Mainstream-Linux.
  • Bei uCLinux ist das Design für Prozessoren ohne MMU vorgesehen und kann die virtuelle Speicherverwaltungstechnologie des Prozessors nicht nutzen. uCLinux verwendet weiterhin die Speicher-Paging-Verwaltung und das System paginiert beim Start den tatsächlichen Speicher. Das Programm lädt Seiten, während die Anwendung geladen wird. Da es jedoch keine MMU-Verwaltung gibt, wendet uCLinux tatsächlich eine echte Speicherverwaltungsstrategie an.

    Das uCLinux-System hat direkten Zugriff auf den Speicher und die Adressen, auf die in allen Programmen zugegriffen wird, sind tatsächliche physische Adressen. Das Betriebssystem schützt den Speicherplatz nicht und jeder Prozess teilt sich tatsächlich einen laufenden Speicherplatz. Bevor ein Prozess ausgeführt wird, muss das System dem Prozess ausreichend kontinuierlichen Adressraum zuweisen und dann alles in den kontinuierlichen Speicherplatz des Hauptspeichers laden.
  • Vorgänge ohne Speicherschutz

    (Memory Protection) führen zu folgenden Ergebnissen:
  • Selbst wenn ein ungültiger Zeiger von einem nichtprivilegierten Prozess aufgerufen wird, wird ein Adressfehler ausgelöst, der möglicherweise zum Absturz des Programms oder sogar zum Absturz des Programms führen kann System zum Absturz bringen. Offensichtlich muss der auf einem solchen System ausgeführte Code sorgfältig programmiert und gründlich getestet werden, um Robustheit und Sicherheit zu gewährleisten.

    Für normales Linux müssen unterschiedliche Benutzerprogramme ausgeführt werden. Ohne Speicherschutz wird die Sicherheit und Zuverlässigkeit des Systems jedoch erheblich beeinträchtigt, da die ausgeführten Programme häufig ab Werk ausgeliefert werden Wenn die Anwendung bereits einmal verfestigt wurde, besteht keine versteckte Gefahr des Eindringens von Programmen, die die Systemsicherheit gefährden. Daher kann die Wahrscheinlichkeit von Problemen in einem begrenzten Rahmen kontrolliert werden, solange die Anwendung relativ vollständig getestet wurde.

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-Tutorial

Das 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn