


Pertempuran praktikal |. RISC-V Linux alamat kemasukan 2M terpelihara pengoptimuman
Artikel sebelumnya menganalisis penciptaan jadual halaman untuk permulaan RISC-V Linux Disebutkan bahawa alamat kemasukan RISC-V Linux mesti sejajar 2M Hari ini saya akan bercakap tentang cara menyelesaikan masalah penjajaran 2M, atau bagaimana mengoptimumkan sebahagian daripada ingatan.
Nota: Artikel ini berdasarkan kernel linux5.10.111
Analisis penggunaan memori
Apabila setiap cip keluar dari kilang. Dengan anggapan cip itu telah kukuh di dalam kilang bootrom adalah 0x0, iaitu, di atas Selepas dihidupkan, program akan mula berjalan dari alamat 0x0.
Sebelum memulakan RISC-V Linux, anda perlu menjalankan opensbi terlebih dahulu, jadi opensbi perlu diletakkan di alamat 0x0
处,这样芯片上电后,就会从0x0
地址处执行opensbi。在opensbi运行完后,会跳转到opensbi运行地址偏移2M的位置去执行下一级boot(这里下一级boot是kernel),即跳转到0x200000
地址处运行kernel,因此应该把kernel放到内存的0x200000
.
Rajah agihan ingatan adalah seperti berikut:

Untuk kernel, ia akan memuatkan alamat dari kernelnya sendiri apabila bermula (iaitu 0x200000
) mula mewujudkan pemetaan jadual halaman. Hanya apabila pemetaan jadual halaman ditubuhkan untuk memori fizikal, kenangan ini boleh diakses kemudian. Kernel memuatkan memori 2M di hadapan alamat (iaitu 0x0 - 0x200000
) akan diabaikan oleh kernel, dan jadual halaman tidak akan ditubuhkan untuk memori 2M ini, iaitu, kernel tidak boleh mengakses memori 2M ini. 0x200000
)开始建立页表映射,只有对物理内存建立了页表映射,后面才能访问这些内存。而kernel加载地址前面的2M内存(即0x0 - 0x200000
)将被kernel忽略,不会对这2M内存建立页表,即kernel无法访问这2M内存。
在QEMU上RISC-V Linux的启动信息:

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

因此在Kernel和opensbi之间会存在1.5M
: Opensbi masih diletakkan pada permulaan memori Dengan mengubah suai kod sumber kernel dan mengangkat sekatan penjajaran 2M, alamat kernel boleh dialihkan ke hadapan. Pilihan 2
Pilihan 1
Kami meletakkan opensbi di hujung memori, dan alamat kemasukan kernel masih mengekalkan penjajaran 2M.
Iaitu, kernel diletakkan di hadapan memori, dan opensbi diletakkan di belakang:

Sebagai contoh, kernel diletakkan di alamat 0x0
地址处,opensbi放到内存的0x10000000
地址处。这样kernel前面就不会有预留内存,只不过这样需要修改bootrom的地址,将地址从0x0
修改为0x0x10000000
。这种方案只适合芯片还没出厂前,因为用户无法修改bootrom的地址,芯片出厂后,bootrom地址是固定的,假设bootrom地址为0x0
,那么芯片上电后,就会从0x0
开始运行程序,所以opensbi必须放到0x0
memori, jadi kernel hanya boleh diimbangi oleh 2M.
Pilihan 2
Kami juga boleh mengubah suai kod sumber kernel RISC-V Linux untuk menarik balik sekatan penjajaran 2M. Kita hanya perlu setup_vm ()
fungsi, tukar jadual halaman peringkat kedua asal kepada jadual halaman peringkat ketiga, supaya alamat kemasukan kernel hanya perlu diselaraskan pada 4K, supaya kernel boleh bergerak ke hadapan, dengan itu menggunakan ingatan hadapan. setup_vm()
函数中,将原来的二级页表改为三级页表,这样kernel入口地址只需要4K对齐,因此就能将kernel往前挪,从而利用前面的内存。
修改代码
路径:arch/riscv/mm/init.c
Ubah suai kod

arch /riscv/mm/init.c
Ulas semakan penjajaran 2M asal:

Tukar pemetaan jadual halaman 2M pertama bagi kernel daripada jadual halaman peringkat kedua kepada jadual halaman peringkat ketiga :
//新增一个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); }
Pemetaan jadual halaman keseluruhan kernel ditukar daripada jadual halaman peringkat kedua kepada jadual halaman peringkat ketiga:


//定义三个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); }

Atas ialah kandungan terperinci Pertempuran praktikal |. RISC-V Linux alamat kemasukan 2M terpelihara pengoptimuman. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Sebagai bahagian teras sistem pengendalian, kernel Linux bertanggungjawab untuk fungsi penting seperti mengurus sumber perkakasan dan menyediakan panggilan sistem. Artikel ini akan menyelidiki lima bahagian utama kernel Linux, termasuk pengurusan proses, sistem fail, komunikasi rangkaian, pemacu peranti dan pengurusan memori, dan menyediakan pengenalan terperinci dan contoh kod. 1. Penciptaan Proses Pengurusan Proses Dalam kernel Linux, penciptaan proses dilaksanakan melalui panggilan sistem fork(). Berikut ialah kod contoh mudah: #include

Ia panjang dan mempunyai banyak kandungan teknikal, jadi klik untuk mengikutinya dan anda tidak akan tersesat. Prakata: Memahami Kernel Linux Sistem komputer ialah simbiosis perkakasan dan perisian ia saling bergantung dan tidak boleh dipisahkan. Perkakasan komputer Langkah pemindahan kernel Linux termasuk peranti persisian, pemproses, memori, pemacu keras dan peranti elektronik lain yang membentuk silinder komputer. Dan tanpa perisian untuk mengendalikan dan mengawalnya, ia tidak boleh berfungsi dengan sendirinya. Perisian yang melengkapkan kerja kawalan ini dipanggil sistem pengendalian Dalam terminologi Linux, ia dipanggil "kernel" atau "teras". Modul utama (atau komponen) kernel Linux dibahagikan kepada bahagian berikut: pengurusan storan, pengurusan CPU dan proses, sistem fail, pengurusan peranti dan pemacu, komunikasi rangkaian forum Linux dan sistem

Artikel sebelumnya menganalisis penciptaan jadual halaman untuk permulaan RISC-V Linux Telah disebutkan bahawa alamat kemasukan RISC-V Linux mesti sejajar 2M Hari ini saya akan bercakap tentang cara menyelesaikan masalah penjajaran 2M, atau cara mengoptimumkan sebahagian daripada ingatan itu.

Hello pembaca yang dikasihi! Di sini, saya berbesar hati untuk berkongsi dengan anda pengalaman dan kemahiran berharga yang telah saya kumpulkan sebagai jurutera rangkaian kanan dengan kemahiran profesional saya dalam pembangunan dan pengoptimuman tindanan protokol TCP kernel Linux. Saya percaya bahawa melalui artikel ini, kita boleh belajar daripada satu sama lain dan membincangkannya, dan membawa bahan rujukan yang praktikal dan berguna kepada anda yang mempunyai minat yang kuat dalam bidang ini atau sedang mengusahakannya. 1. Penubuhan sambungan TCP Penubuhan sambungan TCP ialah urus niaga utama timbunan protokol TCP, tetapi bukan perkara biasa untuk menghadapi banyak masalah sambungan. Selepas pertimbangan yang teliti dan penyahpepijatan terperinci, saya menemui beberapa masalah biasa dan praktikal serta penyelesaiannya, termasuk mencegah serangan banjir SYN (dengan melaraskan parameter sistem) dan menangani kesesakan rangkaian (iaitu, menggunakan TCPFastOp

Membincangkan pandangan bahawa kernel Linux memainkan peranan penting dalam reka bentuk dan pelaksanaan kernel Linux melalui analisis mendalam tentang reka bentuk kernel Linux dan aplikasi praktikal, ia mendedahkan kedudukan dan pengaruhnya yang menonjol dalam bidang ini. 1. Pengurusan memori yang dioptimumkan Dengan menggunakan teknologi pengurusan memori maya, kernel Linux boleh melengkapkan peruntukan memori dan kitar semula dengan cekap. Dengan bantuan algoritma halaman gantian, kernel Linux direka bentuk dan dilaksanakan untuk mengendalikan hubungan pemetaan antara memori fizikal dan memori maya dengan tepat. Pelarasan fleksibel boleh dibuat berdasarkan keperluan khusus aplikasi, dengan itu meningkatkan prestasi sistem keseluruhan. 2. Kernel pengurusan proses yang berkuasa menggunakan teknologi pelbagai tugas yang sangat baik untuk membolehkan pelbagai proses wujud bersama secara harmoni dalam satu sistem. Dirumus dengan teliti

Ini ialah artikel 1500 perkataan yang meneroka pengedaran kod sumber kernel Linux secara mendalam. Oleh kerana ruang yang terhad, kami akan menumpukan pada struktur organisasi kod sumber kernel Linux dan menyediakan beberapa contoh kod khusus untuk membantu pembaca memahami dengan lebih baik. Kernel Linux ialah kernel sistem pengendalian sumber terbuka yang kod sumbernya dihoskan pada GitHub. Keseluruhan pengedaran kod sumber kernel Linux adalah sangat besar, mengandungi ratusan ribu baris kod, melibatkan berbilang subsistem dan modul yang berbeza. Untuk mendapatkan pemahaman yang lebih mendalam tentang kod sumber kernel Linux

Sistem Android dan kernel Linux adalah dua entiti yang berkait rapat, dan hubungan antara mereka adalah rapat dan kompleks. Dalam sistem Android, kernel Linux memainkan peranan penting, menyediakan pemacu perkakasan asas dan sokongan panggilan sistem untuk sistem Android. Artikel ini akan meneroka hubungan antara sistem Android dan kernel Linux, cara ia berinteraksi dan berfungsi bersama, serta menyediakan beberapa contoh kod khusus. Android ialah sistem pengendalian mudah alih yang dibangunkan berdasarkan kernel Linux dan digunakan terutamanya untuk peranti mudah alih seperti telefon pintar dan tablet. L

Kernel Linux ialah teras sistem pengendalian dan mengawal akses kepada sumber sistem seperti CPU, peranti I/O, memori fizikal dan sistem fail. Semasa proses but dan semasa sistem berjalan, kernel menulis pelbagai mesej ke penimbal cincin kernel. Mesej ini termasuk pelbagai maklumat tentang operasi sistem.
