Linux-kernel-ARM-Übersetzung-Tabelle base (TTB0 und TTB1)
Kompilierte Linux-kernel 2.6.34.3 für ARMv7 (Cortex-a8)
Schaute ich in den kernel-code, und es sieht aus wie der Linux-kernel stellt die hardware-Seite Tabellen für den kernel-Adressraum (alles über 0xC0000000)auf TTB1 (translation table base) und der Benutzer-Prozess auf ttb0 (alles unter 0xC0000000), die änderungen für jeden Prozess-Kontext wechseln. Ist das richtig? Ich bin immer noch verwirrt, wie die MMU weiß, das ttb zu sehen für übersetzungen?
Habe ich gelesen, dass die TTBCR (translation table base-control-register) bestimmt, die von der ttb registrieren zu gehen, wenn eine MVA ist nicht gefunden, aber das register liest immer 0 immer verwenden TTBR0 in den ARM architecture reference manual. Wie ist das möglich? Kann jemand mir erklären, wie der Linux-kernel verwendet diese zwei ttbs?
Ich Lesen, wie die ttb-Werke von dieser Website https://www.cs.rutgers.edu/~pxk/416/notes/10-paging.html, aber ich immer noch nicht verstehen, wie der Kern mit den zwei ttbs
(Doppelt überprüft den kernel-code aus irgendeinem Grund beide ttb0 und ttb1 gesetzt, aber es scheint, wie ttb1 nie verwendet, habe ich die TTB1 register auf 0 und der Linux-kernel weiterhin wie gewohnt ausgeführt)
- Auf den link, den Sie umschlossen,
TTBR0 will still contain the memory map for the operating system and memory-mapped I/O.
ich vermute, Sie wollte sagenTTBR1 will still contain the memory map for the operating system and memory-mapped I/O.
, das macht viel mehr Sinn, in Richtung der 3G/1G (2G/2G) Arbeitsspeicher aufgeteilt.TTBR0
Karten-Prozess ALS mit-Adresse von 0 bis 0xbfffffff,TTBR0
geschaltet ist, während jeder Prozess wechseln.TTBR1
nie geändert werden, da es enthält den link zu den kernel (ab 0xc000000 auf ein Linux mit einem 3G/1G-split). - Vielen Dank für die Antwort, also ist es korrekt, dass für jede Tabelle gehen die hardware verwendet NUR TTB0? Die hardware nicht die TTBCR zu bestimmen, welche der ttb-register zu gehen? So TTB1 ist nur zum kopieren einer OS-Seiten, um die Prozess-Seiten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den TTBR-Register werden zusammen verwendet, um zu bestimmen, die Adressierung für die 32-bit oder 40-bit-Adressraum. Welches register ist für was Adressbereiche erfolgt über die tXsz bits in der TTBCR. Es gibt einen Eintrag für t0sz entsprechend TTBR0 und t1sz für TTBR1.
Die Seite Tabellen behoben, indem jeder TTBRx register sind unabhängig, aber Sie in der Regel finden die meisten Linux-Implementierungen verwenden Sie einfach TTBR0. Linux erwartet, in der Lage, eine 3G/1G-Adresse Raum-Partitionierungsschema, das ist nicht unterstützt durch den ARM. Wenn Sie Blick auf Seite B3-1345 der ARMv7-Architektur-Referenzhandbuch, werden Sie sehen, dass der Wert von t0sz und t1sz bestimmen die Adressbereiche unterstützt durch TTBR0 und TTBR1 beziehungsweise. Hinzufügen Verwirrung und Orientierungslosigkeit, ist es sogar möglich, getrennte Adressräume, wo TTBR0 und TTBR1 support-Bereiche, die nicht unmittelbar aufeinander Folgen, wodurch ein Loch im system-Adressraum. Gute Zeiten!
Zur Beantwortung Ihrer wichtigsten Frage, obwohl, es wird empfohlen, von ARM, so dass TTBR0 verwendet werden, zum speichern der offset auf der Seite Tabellen verwendet, die durch USER-Prozesse, und TTBR1 verwendet werden, zum speichern der offset auf der Seite Tabellen verwendet durch den KERNEL. Ich habe noch nicht gesehen, eine einzige Implementierung, die das wirklich macht. Fast ausschließlich TTBR0 ist in allen Fällen, mit TTBR1 mit einer Kopie des L1-Tabellen.
So, wie funktioniert das? Der Wert von TTBR gespeichert ist, als Teil des Prozess-Status und einfach wiederhergestellt werden jedes mal, wenn ein Prozess mit eingeschaltet. Dies ist, wie es arbeiten soll. Ursprünglich TTBR1 halten würde, einen Konstanten Wert für die kernel-Tabellen und nie ersetzt oder ausgelagert, in der Erwägung, dass TTBR0 geändert werden würde, jedes mal, wenn Sie den Kontext wechseln zwischen Prozessen. Anscheinend ist den meisten Linux-Implementierungen für ARM entschieden haben, nur grundsätzlich um die Verwendung von TTBR1 und bleiben, um mit TTBR0 für alles.
Wenn Sie wollen, diese Theorie zu testen auf Ihrem Gerät, versuchen Sie whacking TTBR1 und ansehen nichts passieren. Dann versuchen whacking TTBR0 und überwachen Sie Ihr system Abstürzen. Ich habe noch auch eine einzige Instanz, die nicht zu diesem Ergebnis führen genau das gleiche Ergebnis. Lange Geschichte kurz, TTBR1 ist nutzlos, Linux und TTBR0 fast ausschließlich verwendet wird und einfach ausgelagert.
Nun, wenn man einmal zu LPAE-Unterstützung, werfen alles Weg und wieder von vorne anfangen. Dies ist die Umsetzung, wo Sie beginnen zu sehen, den Wert der t0sz und t1sz wird etwas anderes als null, und damit N als gut.
Ich habe sehr wenig wissen über die ARM-Architektur, sondern von dem, was ich lese in Ihrem beigefügten link, dann denke ich, dass Linux implementiert seine virtual-memory-management, die Art und Weise:
Register
TTBCR
sagt, welche Adressen übersetzt werden, Seite-Tabellen verweistTTBR0
oderTTBR1
. WennTTBCR
enthält0xc000000
ist, dann wird jede Adresse aus0
zu0xbfffffff
ist übersetzt von der Seite-Tabelle zeigteTTBR0
, und eine beliebige Adresse aus0xc0000000
zu0xffffffff
ist übersetzt von der Seite-Tabelle zeigteTTBR1
. In übereinstimmung mit den Linux-Speicher-split von 3 GB für Benutzer-Prozess /1 GB für den kernel.Daher, den Wert der
TTBR1
sollte sich nie ändern weil Sie wollen, dass der kernel dauerhaft zugeordnet (denken, was passiert, wenn ein interrupt ausgelöst wird). Auf der anderen SeiteTTBR0
geändert wird, bei jeder Prozess-Schalter, es enthält die Seitentabelle für den aktuellen Prozess.Sehen http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211k/Bihgfcgf.html
Für ARM5 und senken Sie die TTB-Tabelle ist eine Feste Größe und Ausrichtung (zu 16k). Jede Ebene 1-Eintrag darstellt 1MB. Die Tabelle Eintrag ist 32-bit (16k*1M/(32bit/8) = 4 GB). Die TTBCR Kontrollen TTBR0 Tabelle Größe. Aus der obigen URL
Also die Größe der TTBR0 setzt auch den memory-split. Für ein
traditionelleLinux3G/1G1G/3G, den Wert 2 ausgewählt werden sollte. 4kB Tabelle == 1G Speicher == bits 31..30 sind null. Für einen Wert von 6 die Tabelle ist 256byte == 64MB == bits 31..26 null sind.Im Linux-Sprachgebrauch sind diese Seite global Einträge (und diese teilt dieses Seite global - Verzeichnis). Die Einträge können auf eine andere Tabelle verweist oder einfach nur ein 1MB segment. Die nächsten Einträge sind Seite Mitte Linux-Verzeichnisse und dann die endgültige Seite Tabelle Einträge. Ich denke, die Seite Mitte Einträge unbenutzt auf dem ARM.
MMU-hardware geht nicht die Tabellen jedes mal. Es ist ein TLB (translation look aside buffer). Es ist wie ein cache der MMU-Tabellen. Wenn die OS-updates diese Tabellen, die der TLB geleert werden müssen oder die der Prozessor verwenden veraltete Einträge. Ähnlich wie die ARM-cache ist virtuellen tagged, so dass eine änderung der Zuordnung kann auch bedeuten, die cache geleert werden müssen. Aus diesen Gründen nie wollen, Dinge zu ändern, die auf einem Kontext-switch. Shared libraries, text (sagen libc.so) sollte die gleiche sein, die auf einem Kontext-switch. Hoffentlich jeder Prozess hat libc.so zugeordnet, an der gleichen virtuellen Adresse. Es ist ein großer Gewinn dabei; geringeren memory-Nutzung und gute I-cache verwenden.
Den domain und PID - Register als auch als supervisor - /user-Modi können auch durch den Speicher zugreift. Dies sind die einzigen Register, die kann umgeschaltet werden auf ein context-switch.
Sehen http://lwn.net/images/conf/rtlws11/papers/proc/p01.pdf für die info, PID und domain verwenden, auf der ARMV5. Die aktuellen Linux-Quellen nicht genau wie das Papier beschreibt. Es ist durchaus möglich, dass Linux nicht braucht, um diesen Mechanismus zu verwenden, und legt die TTBCR auf null, so dass die VM-code für ARM-sub-Architekturen ist ähnlich.
Edit: ich nicht glauben, dass die TTBCR Funktionalität kann verwendet werden, um zu erreichen, 3G/1G aufgeteilt. Ich denke, der Rutger ' s Seite war die Erörterung der TTBCR generisch und nicht in der Linux Kontext. Auch, zumindest die 2.6.38 Linux verwendet domains oder DACR aber nicht die pid oder fcse, wie es unterstützt eine begrenzte Anzahl von Prozessen.
http://lwn.net/Articles/106177/ - verweist auch auf die Rutgers-Seite.
Den TTBR0 enthält die Basis-Adresse der übersetzungstabelle 0, und Informationen über den Speicher belegt.
Dies ist einer der übersetzungs-Tabellen für die Stufe 1 übersetzung von speicherzugriffen, die aus anderen Modi als Hyp-Modus