Im vorherigen Artikel wurde die Erstellung der Seitentabelle für den RISC-V-Linux-Start analysiert. Es wurde erwähnt, dass die RISC-V-Linux-Eintragsadresse 2M-ausgerichtet sein muss. Heute werde ich darüber sprechen, wie das 2M-Ausrichtungsproblem gelöst werden kann Optimieren Sie einen Teil des Speichers.
Hinweis: Dieser Artikel basiert auf dem Linux 5.10.111-Kernel Das Bootrom ist 0x0, also das oben genannte. Nach dem Einschalten beginnt das Programm mit der Ausführung ab Adresse 0x0.
Bevor Sie RISC-V Linux starten, müssen Sie zunächst OpenSBI ausführen, daher sollte OpenSBI an der Adresse
platziert werden. Das Speicherverteilungsdiagramm sieht wie folgt aus:
Für den Kernel lädt er beim Start die Adresse aus seinem eigenen Kernel (d. h. 0x200000) beginnt mit der Einrichtung der Seitentabellenzuordnung. Erst wenn die Seitentabellenzuordnung für den physischen Speicher eingerichtet ist, kann später auf diese Speicher zugegriffen werden. Der Kernel lädt den 2M-Speicher vor der Adresse (d. h. 0x0 - 0x200000) wird vom Kernel ignoriert und die Seitentabelle wird für diesen 2M-Speicher nicht erstellt, d. h. der Kernel kann nicht auf diesen 2M-Speicher zugreifen. 0x200000)开始建立页表映射,只有对物理内存建立了页表映射,后面才能访问这些内存。而kernel加载地址前面的2M内存(即0x0 - 0x200000)将被kernel忽略,不会对这2M内存建立页表,即kernel无法访问这2M内存。
Aber Opensbi muss eigentlich keinen Bereich von bis zu 2 MB verwenden. Der Standardwert ist 512KB, openBis pmp schützt dies512 KB Speicher, auf den andere Programme nicht zugreifen dürfen.
Es wird also 1.5M Memory Gap , und Dieser Teil der Speicherlücke wird vom Programm nicht genutzt, was zu einer Speicherverschwendung führt. Wie kann der Kernel also den vorherigen Teil des Speichers nutzen?
Optimierungsplan
Es gibt zwei Pläne zur Optimierung dieses 2M-Speichers: 🎜🎜🎜Option 1🎜: Platzieren Sie opensbi am Ende des Speichers, und die Kernel-Eintragsadresse behält weiterhin die 2M-Ausrichtung bei. 🎜🎜🎜Option 2🎜: Opensbi wird weiterhin am Anfang des Speichers platziert, indem der Kernel-Quellcode geändert und die 2M-Ausrichtungsbeschränkung aufgehoben wird. 🎜
Option 1
Wir setzen opensbi am Ende des Speichers und die Kernel-Eintragsadresse behält weiterhin die 2M-Ausrichtung bei.
Das heißt, der Kernel wird an der Vorderseite des Speichers platziert, und OpenSBI wird an der Rückseite platziert:
Zum Beispiel wird der Kernel an der 0x0地址处,opensbi放到内存的0x10000000地址处。这样kernel前面就不会有预留内存,只不过这样需要修改bootrom的地址,将地址从0x0修改为0x0x10000000。这种方案只适合芯片还没出厂前,因为用户无法修改bootrom的地址,芯片出厂后,bootrom地址是固定的,假设bootrom地址为0x0,那么芯片上电后,就会从0x0开始运行程序,所以opensbi必须放到0x0-Adresse des Speichers platziert, sodass der Kernel nur dort platziert werden kann um 2M versetzt.
Option 2
Wir können auch den Kernel-Quellcode von RISC-V Linux ändern, um die 2M-Ausrichtungsbeschränkung aufzuheben. Wir müssen nur setup_vm()函数中,将原来的二级页表改为三级页表,这样kernel入口地址只需要4K对齐,因此就能将kernel往前挪,从而利用前面的内存。
修改代码
路径:arch/riscv/mm/init.c
Ändern Sie den Code
Pfad: Kommentieren Sie die ursprüngliche 2M-Ausrichtungsprüfung: <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/001/275/014/c7e509d7617b0db9c82675869ffc46b1-5.png" class="lazy" alt="Praktischer Kampf |. RISC-V Linux-Eintragsadresse 2M reservierter Speicheroptimierung" ></figure><p data-tool="mdnice编辑器" style="max-width:90%">Ändern Sie die erste 2M-Seitentabellenzuordnung des Kernels von der Seitentabelle der zweiten Ebene zur Seitentabelle der dritten Ebene : </p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>//新增一个PTE
pte_t trampoline_pte[PTRS_PER_PTE] __page_aligned_bss;
create_pgd_mapping(trampoline_pg_dir,PAGE_OFFSET,
(uintptr_t)trampoline_pmd,PGDIR_SIZE,PAGE_TABLE);
create_pmd_mapping(trampoline_pmd,PAGE_OFFSET,
(uintptr_t)trampoline_pte,PMD_SIZE,PAGE_TABLE);
end_va = PAGE_OFFSET + PMD_SIZE;
for (va = PAGE_OFFSET; va < end_va; va += PAGE_SIZE)
{
create_pte_mapping(trampoline_pte,PAGE_OFFSET,
load_pa + (va - PAGE_OFFSET),
PAGE_SIZE,PAGE_KERNEL_EXEC);
}</pre><div class="contentsignin">Nach dem Login kopieren</div></div><blockquote data-tool="mdnice编辑器" style="border-top: none;border-right: none;border-bottom: none;font-size: 0.9em;overflow: auto;color: rgb(106, 115, 125);padding: 10px 10px 10px 20px;margin-bottom: 20px;margin-top: 20px;border-left-color: rgb(239, 112, 96);background: rgb(255, 249, 249);"><p style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;color: black;line-height: 26px;"> </p></blockquote>Die Seitentabellenzuordnung des gesamten Kernels wird von der Seitentabelle der zweiten Ebene zur Seitentabelle der dritten Ebene geändert: <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/001/275/014/c7e509d7617b0db9c82675869ffc46b1-6.png" class="lazy"/ alt="Praktischer Kampf |. RISC-V Linux-Eintragsadresse 2M reservierter Speicheroptimierung" ></figure> Angenommen, die Kernelgröße beträgt 4M+<figure data-tool="mdnice编辑器" style="max-width:90%"><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/001/275/014/a7829a7a1222941854d964b7628a1977-7.png" class="lazy"/ alt="Praktischer Kampf |. RISC-V Linux-Eintragsadresse 2M reservierter Speicheroptimierung" ><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>//定义三个PTE
pte_t load_sz_pte[PTRS_PER_PTE] __page_aligned_bss;
pte_t load_sz_pte1[PTRS_PER_PTE] __page_aligned_bss;
pte_t load_sz_pte2[PTRS_PER_PTE] __page_aligned_bss;
//=======0-2M======
create_pgd_mapping(early_pg_dir,PAGE_OFFSET,
(uintptr_t)early_pmd,PGDIR_SIZE,PAGE_TABLE);
create_pmd_mapping(early_pmd,PAGE_OFFSET,
(uintptr_t)load_sz_pte,PMD_SIZE,PAGE_TABLE);
end_va = PAGE_OFFSET + PMD_SIZE;
for (va = PAGE_OFFSET; va < end_va; va += PAGE_SIZE)
{
create_pte_mapping(load_sz_pte,PAGE_OFFSET,
load_pa + (va - PAGE_OFFSET),
PAGE_SIZE,PAGE_KERNEL_EXEC);
}
//=======2-4M==========
create_pgd_mapping(early_pg_dir,PAGE_OFFSET + PMD_SIZE,
(uintptr_t)early_pmd,PGDIR_SIZE,PAGE_TABLE);
create_pmd_mapping(early_pmd,PAGE_OFFSET,
(uintptr_t)load_sz_pte1,PMD_SIZE,PAGE_TABLE);
end_va = PAGE_OFFSET + (PMD_SIZE * 2);
for (va = PAGE_OFFSET + PMD_SIZE; va < end_va; va += PAGE_SIZE)
{
create_pte_mapping(load_sz_pte1,va,
load_pa + (va - PAGE_OFFSET),
PAGE_SIZE,PAGE_KERNEL_EXEC);
}
//=======4-6M==========
create_pgd_mapping(early_pg_dir,PAGE_OFFSET + (PMD_SIZE*2),
(uintptr_t)early_pmd,PGDIR_SIZE,PAGE_TABLE);
create_pmd_mapping(early_pmd,PAGE_OFFSET,
(uintptr_t)load_sz_pte2,PMD_SIZE,PAGE_TABLE);
end_va = PAGE_OFFSET + (PMD_SIZE * 3);
for (va = PAGE_OFFSET + (PMD_SIZE*2); va < end_va; va += PAGE_SIZE)
{
create_pte_mapping(load_sz_pte2,va,
load_pa + (va - PAGE_OFFSET),
PAGE_SIZE,PAGE_KERNEL_EXEC);
}</pre><div class="contentsignin">Nach dem Login kopieren</div></div>🎜🎜 🎜🎜Durch Ändern des obigen Codes kann der Kernel-Eintrag sein. Verschieben Sie die Adresse um 1,5 MB nach vorne und reservieren Sie nur 512 KB für OpenSBI, sodass nach dem Start von RISC-V Linux der verfügbare physische Speicher erhöht wird. 🎜
Zusammenfassung
Der 2M-Ausrichtungsvorgang für die RISC-V-Linux-Eintragsadresse wurde noch nicht erklärt, aber es sollte 2M für OpenSBI reserviert werden, sodass der Kernel nur eine sekundäre Seitentabelle erstellt hat Die Eingangsadresse muss 2M-ausgerichtet sein. Bisher hat noch niemand eine Optimierungslösung für diesen Teil des Speichers angegeben. Ich hoffe, dass die Optimierungslösung in diesem Artikel einigen Menschen helfen und allen etwas Inspiration geben kann.
Das obige ist der detaillierte Inhalt vonPraktischer Kampf |. RISC-V Linux-Eintragsadresse 2M reservierter Speicheroptimierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Erklärung dieser Website
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
Als Kernbestandteil des Betriebssystems ist der Linux-Kernel für wichtige Funktionen wie die Verwaltung von Hardwareressourcen und die Bereitstellung von Systemaufrufen verantwortlich. Dieser Artikel befasst sich mit den fünf Hauptteilen des Linux-Kernels, einschließlich Prozessverwaltung, Dateisystem, Netzwerkkommunikation, Gerätetreiber und Speicherverwaltung, und bietet eine detaillierte Einführung und Codebeispiele. 1. Prozessverwaltung Prozesserstellung Im Linux-Kernel wird die Prozesserstellung durch den Systemaufruf fork() implementiert. Hier ist ein einfacher Beispielcode: #include
Es ist lang und enthält viele technische Inhalte. Klicken Sie also, um ihm zu folgen, und Sie werden sich nicht verlaufen. Vorwort: Den Linux-Kernel verstehen Ein Computersystem ist eine Symbiose aus Hardware und Software. Sie sind voneinander abhängig und untrennbar. Zu den Schritten zur Transplantation des Linux-Kernels der Computerhardware gehören Peripheriegeräte, Prozessoren, Speicher, Festplatten und andere elektronische Geräte, aus denen der Computerzylinder besteht. Und ohne Software zur Bedienung und Steuerung kann es nicht selbstständig funktionieren. Die Software, die diese Steuerungsarbeit erledigt, wird als Betriebssystem bezeichnet. In der Linux-Terminologie wird es „Kernel“ oder „Kern“ genannt. Die Hauptmodule (oder Komponenten) des Linux-Kernels sind in die folgenden Teile unterteilt: Speicherverwaltung, CPU- und Prozessverwaltung, Dateisystem, Geräteverwaltung und Treiber, Netzwerkkommunikation, Linux-Forum und System
Im vorherigen Artikel wurde die Erstellung von Seitentabellen für den RISC-V-Linux-Start analysiert. Es wurde erwähnt, dass die RISC-V-Linux-Eintragsadresse auf 2M ausgerichtet sein muss. Heute werde ich darüber sprechen, wie das 2M-Ausrichtungsproblem gelöst oder teilweise optimiert werden kann die Erinnerung.
Hallo liebe Leser! Es ist mir eine Ehre, die wertvollen Erfahrungen und Fähigkeiten, die ich als leitender Netzwerkingenieur mit meinen beruflichen Fähigkeiten in der Entwicklung und Optimierung des Linux-Kernel-TCP-Protokollstapels gesammelt habe, mit Ihnen zu teilen. Ich glaube, dass wir durch diesen Artikel voneinander lernen und darüber diskutieren können und praktische und nützliche Referenzmaterialien für Sie bereitstellen können, die ein starkes Interesse an diesem Bereich haben oder verwandte Arbeiten ausführen. 1. TCP-Verbindungsaufbau Der TCP-Verbindungsaufbau ist eine Schlüsseltransaktion des TCP-Protokollstapels, es kommt jedoch nicht selten vor, dass viele Verbindungsprobleme auftreten. Nach sorgfältiger Überlegung und detailliertem Debugging entdeckte ich einige häufige und praktische Probleme und deren Lösungen, darunter die Verhinderung von SYN-Flooding-Angriffen (durch Anpassen der Systemparameter) und den Umgang mit Netzwerküberlastungen (d. h. die Verwendung von TCPFastOp).
Erörtert die Ansicht, dass der Linux-Kernel eine wichtige Rolle bei der Gestaltung und Implementierung von Linux-Kerneln spielt. Durch eine eingehende Analyse des Linux-Kernel-Designs und praktischer Anwendungen wird seine herausragende Stellung und sein Einfluss auf diesem Gebiet deutlich. 1. Optimierte Speicherverwaltung Durch die Verwendung der virtuellen Speicherverwaltungstechnologie kann der Linux-Kernel die Speicherzuweisung und -wiederverwendung effizient durchführen. Mit Hilfe des Ersetzungsseitenalgorithmus wird der Linux-Kernel so entworfen und implementiert, dass er die Zuordnungsbeziehung zwischen physischem Speicher und virtuellem Speicher genau handhabt. Basierend auf den spezifischen Anforderungen der Anwendung können flexible Anpassungen vorgenommen werden, wodurch die Gesamtsystemleistung verbessert wird. 2. Der leistungsstarke Prozessmanagement-Kernel nutzt seine hervorragende Multitasking-Technologie, um die harmonische Koexistenz mehrerer Prozesse in einem einzigen System zu ermöglichen. Sorgfältig formuliert
Dies ist ein Artikel mit 1500 Wörtern, der die Verteilung des Linux-Kernel-Quellcodes eingehend untersucht. Aufgrund des begrenzten Platzes konzentrieren wir uns auf die Organisationsstruktur des Linux-Kernel-Quellcodes und stellen einige spezifische Codebeispiele bereit, um den Lesern ein besseres Verständnis zu ermöglichen. Der Linux-Kernel ist ein Open-Source-Betriebssystemkernel, dessen Quellcode auf GitHub gehostet wird. Die gesamte Quellcodeverteilung des Linux-Kernels ist sehr umfangreich und enthält Hunderttausende Codezeilen, die mehrere verschiedene Subsysteme und Module umfassen. Um ein tieferes Verständnis des Linux-Kernel-Quellcodes zu erlangen
Das Android-System und der Linux-Kernel sind zwei eng verwandte Einheiten, und die Beziehung zwischen ihnen ist eng und komplex. Im Android-System spielt der Linux-Kernel eine wichtige Rolle, da er zugrunde liegende Hardwaretreiber und Systemaufrufunterstützung für das Android-System bereitstellt. In diesem Artikel wird die Beziehung zwischen dem Android-System und dem Linux-Kernel untersucht, wie sie interagieren und zusammenarbeiten, und einige spezifische Codebeispiele bereitstellen. Android ist ein mobiles Betriebssystem, das auf Basis des Linux-Kernels entwickelt wurde und hauptsächlich für mobile Geräte wie Smartphones und Tablets verwendet wird. L
Der Linux-Kernel ist der Kern des Betriebssystems und steuert den Zugriff auf Systemressourcen wie CPU, E/A-Geräte, physischen Speicher und Dateisysteme. Während des Bootvorgangs und im laufenden Systembetrieb schreibt der Kernel verschiedene Meldungen in den Kernel-Ringpuffer. Diese Meldungen enthalten verschiedene Informationen zum Systembetrieb.