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.
Bevor Sie RISC-V Linux starten, müssen Sie zunächst OpenSBI ausführen, daher sollte OpenSBI an der AdresseHinweis: 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.
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的启动信息:
但opensbi实际不需要使用2M这么大的范围,默认是512KB
,opensbi的pmp会保护这512KB
内存,不让其他程序访问。
因此在Kernel和opensbi之间会存在1.5M
512KB
, openBis pmp schützt dies512 KB
Speicher, auf den andere Programme nicht zugreifen dürfen.
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. 🎜
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.
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
🎜🎜 🎜🎜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. 🎜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!