Heim >Betrieb und Instandhaltung >Betrieb und Wartung von Linux >Detaillierte Erläuterung des Linux-Benutzerraums und des Kernelraums
Empfohlen: „Linux-Video-Tutorial“
Wenn der Kernelmodulcode oder -thread auf den Speicher zugreift, sind die Speicheradressen im Code alle logische Adressen und entsprechen der tatsächlichen physischen Speicheradresse, eine Eins-zu-Eins-Zuordnung B. ist die physische Adresse, die der logischen Adresse 0xc0000003 entspricht, 0 × 3, die physische Adresse, die 0xc0000004 entspricht, ist 0 × 4, ..., die Beziehung zwischen der logischen Adresse und der physischen Adresse ist Physische Adresse = logische Adresse – 0xC0000000: Dies ist die Adressübersetzungsbeziehung des Kernel-Adressraums. Achten Sie auf die virtuelle Adresse des Kernels. Die virtuelle Adresse befindet sich am „oberen Ende“, die von ihr abgebildete physische Speicheradresse jedoch am unteren Ende .
Physische Speicheradresse | |
0×0 | |
0 ×1 | |
0×2 | |
0×3 | |
… | |
0×20000000 | |
… | |
0×40000000 ?? |
Physische Speicheradresse | 0xF8700000 |
0 xF87000 01 | |
0xF8700002 | |
… | |
0xF87FFFFF | |
Nachdem der Kernel auf den physischen Speicher 0×80000000 ~ 0x800FFFFF zugreift, gibt er den linearen Kernelraum 0xF8700000 ~ 0xF87FFFFF frei. Auf diese Weise können auch andere Prozesse oder Codes die Adresse 0xF8700000 ~ 0xF87FFFFF verwenden, um auf anderen physischen Speicher zuzugreifen. Aus der obigen Beschreibung können wir die grundlegendste Idee des High-End-Speichers erkennen: Leihen Sie sich einen Abschnitt des Adressraums aus, erstellen Sie eine temporäre Adresszuordnung und geben Sie ihn nach der Verwendung frei. Es kann recycelt werden und auf den gesamten physischen Speicher zugreifen. Bei diesem Anblick kommen einige Leute nicht umhin, sich zu fragen: Was passiert, wenn ein Kernel-Prozess oder ein Kernel-Modul weiterhin einen bestimmten logischen Adressraum belegt und ihn nicht freigibt? Wenn diese Situation tatsächlich auftritt, wird der High-End-Speicheradressraum des Kernels immer knapper. Wenn er belegt und nicht freigegeben ist, ist er nicht zugänglich, selbst wenn er nicht dem physischen Speicher zugeordnet ist. 3. Aufteilung Der Kernel unterteilt den High-End-Speicher in 3 Teile: VMALLOC_START~VMALLOC_END, KMAP_BASE~FIXADDR_START und FIXADDR_START~4G. Für High-End-Speicher können Sie die entsprechende Seite über alloc_page() oder andere Funktionen erhalten. Wenn Sie jedoch auf den tatsächlichen physischen Speicher zugreifen möchten, müssen Sie die Seite in eine lineare Adresse umwandeln (warum? Denken Sie darüber nach, wie die MMU auf den physischen Speicher zugreift. Das heißt, wir müssen einen linearen Platz für die Seite finden, die dem High-End-Speicher entspricht. Dieser Vorgang wird als High-End-Speicherzuordnung bezeichnet.
Permanente Kernel-Zuordnung Wenn die Seite, die dem High-End-Speicher entspricht, über alloc_page() abgerufen wird, wie findet man dann einen linearen Platz dafür? Temporäre Kernel-Zuordnung Der Kernel reserviert etwas linearen Platz zwischen FIXADDR_START und FIXADDR_TOP für besondere Anforderungen. Dieser Raum wird als „fester Mapping-Raum“ bezeichnet. Ein Teil davon wird für die temporäre Zuordnung von High-End-Speicher verwendet. (1) Jede CPU belegt einen Raum 1. Hat der Benutzerraum (Prozess) das Konzept des High-End-Speichers? Benutzerprozesse haben kein Konzept für High-End-Speicher. Hoher Speicher existiert nur im Kernel-Bereich. Benutzerprozesse können nur auf bis zu 3 GB physischen Speicher zugreifen, während Kernelprozesse auf den gesamten physischen Speicher zugreifen können.2. Gibt es High-End-Speicher im 64-Bit-Kernel? In der aktuellen Realität gibt es im 64-Bit-Linux-Kernel keinen High-End-Speicher, da der 64-Bit-Kernel mehr als 512 GB Speicher unterstützen kann. Wenn der auf dem Computer installierte physische Speicher den Kernel-Adressraum überschreitet, steht High-End-Speicher zur Verfügung.3. Auf wie viel physischen Speicher kann ein Benutzer zugreifen? Auf wie viel physischen Speicher kann der Kernel-Code zugreifen? 32-Bit-Systembenutzerprozesse können auf bis zu 3 GB zugreifen, und Kernelcode kann auf den gesamten physischen Speicher zugreifen. 64-Bit-Systembenutzerprozesse können auf maximal mehr als 512 GB zugreifen, und Kernelcode kann auf den gesamten physischen Speicher zugreifen.4. Welche Beziehung besteht zwischen High-End-Speicher und physischer Adresse, logischer Adresse und linearer Adresse? High-End-Speicher bezieht sich nur auf logische Adressen und hat keine direkte Beziehung zu logischen Adressen und physischen Adressen. |
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Linux-Benutzerraums und des Kernelraums. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!