Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Praktischer Kampf |. RISC-V Linux-Eintragsadresse 2M reservierter Speicheroptimierung

Praktischer Kampf |. RISC-V Linux-Eintragsadresse 2M reservierter Speicheroptimierung

嵌入式Linux充电站
嵌入式Linux充电站nach vorne
2023-08-01 15:37:59946Durchsuche

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:
Praktischer Kampf |. RISC-V Linux-Eintragsadresse 2M reservierter Speicheroptimierung

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内存。

在QEMU上RISC-V Linux的启动信息:

Praktischer Kampf |. RISC-V Linux-Eintragsadresse 2M reservierter Speicheroptimierung

但opensbi实际不需要使用2M这么大的范围,默认是512KB,opensbi的pmp会保护这512KB内存,不让其他程序访问。

Praktischer Kampf |. RISC-V Linux-Eintragsadresse 2M reservierter Speicheroptimierung

因此在Kernel和opensbi之间会存在1.5M

Startinformationen von RISC-V Linux auf QEMU:

Praktischer Kampf |. RISC-V Linux-Eintragsadresse 2M reservierter Speicheroptimierung 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. Praktischer Kampf |. RISC-V Linux-Eintragsadresse 2M reservierter Speicheroptimierung

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:

Praktischer Kampf |. RISC-V Linux-Eintragsadresse 2M reservierter Speicheroptimierung

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

Praktischer Kampf |. RISC-V Linux-Eintragsadresse 2M reservierter SpeicheroptimierungPfad: 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="https://img.php.cn/upload/article/001/275/014/c7e509d7617b0db9c82675869ffc46b1-5.png" 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><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 &lt; end_va; va += PAGE_SIZE) { create_pte_mapping(trampoline_pte,PAGE_OFFSET, load_pa + (va - PAGE_OFFSET), PAGE_SIZE,PAGE_KERNEL_EXEC); }</pre><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="https://img.php.cn/upload/article/001/275/014/c7e509d7617b0db9c82675869ffc46b1-6.png" 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="https://img.php.cn/upload/article/001/275/014/a7829a7a1222941854d964b7628a1977-7.png" alt="Praktischer Kampf |. RISC-V Linux-Eintragsadresse 2M reservierter Speicheroptimierung" ><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 &lt; 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 &lt; 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 &lt; end_va; va += PAGE_SIZE) { create_pte_mapping(load_sz_pte2,va, load_pa + (va - PAGE_OFFSET), PAGE_SIZE,PAGE_KERNEL_EXEC); }</pre></figure><p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;"></p>🎜🎜 🎜🎜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. 🎜<figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"><img src="https://img.php.cn/upload/article/001/275/014/a7829a7a1222941854d964b7628a1977-8.png" alt="Praktischer Kampf |. RISC-V Linux-Eintragsadresse 2M reservierter Speicheroptimierung" ></figure><h2 data-tool="mdnice编辑器" style="max-width:90%"> <span style="display: none;"></span><span style="display: inline-block;background: rgb(239, 112, 96);color: rgb(255, 255, 255);padding: 2px 10px 1px;border-top-right-radius: 3px;border-top-left-radius: 3px;margin-right: 3px;">Zusammenfassung</span><span style="display: inline-block;vertical-align: bottom;border-bottom: 36px solid #efebe9;border-right: 20px solid transparent;"> </span> </h2> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">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. </p>

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:嵌入式Linux充电站. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen