Rumah Operasi dan penyelenggaraan operasi dan penyelenggaraan linux Pertempuran praktikal |. RISC-V Linux alamat kemasukan 2M terpelihara pengoptimuman

Pertempuran praktikal |. RISC-V Linux alamat kemasukan 2M terpelihara pengoptimuman

Aug 01, 2023 pm 03:37 PM
kernel linux

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:

Pertempuran praktikal |. RISC-V Linux alamat kemasukan 2M terpelihara pengoptimuman

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的启动信息:

Pertempuran praktikal |. RISC-V Linux alamat kemasukan 2M terpelihara pengoptimuman

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

Pertempuran praktikal |. RISC-V Linux alamat kemasukan 2M terpelihara pengoptimuman

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

Maklumat permulaan RISC-V Linux pada QEMU:

Pertempuran praktikal |. RISC-V Linux alamat kemasukan 2M terpelihara pengoptimuman opensbi sebenarnya tidak perlu menggunakan julat sebesar 2M lalai ialah 512KB, pmp opensbi akan melindungimemori 512KB, tidak dibenarkan untuk diakses oleh atur cara lain. . font-size: 14px;overflow-wrap: break-word; padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05 );font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">1.5M jurang memori , dan bahagian jurang memori ini tidak digunakan oleh program, yang akan menyebabkan pembaziran memori Jadi bagaimana untuk membiarkan kernel menggunakan bahagian memori sebelumnya? . Pilihan 2

: Opensbi masih diletakkan pada permulaan memori Dengan mengubah suai kod sumber kernel dan mengangkat sekatan penjajaran 2M, alamat kernel boleh dialihkan ke hadapan.

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:

Pertempuran praktikal |. RISC-V Linux alamat kemasukan 2M terpelihara pengoptimuman

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

Pertempuran praktikal |. RISC-V Linux alamat kemasukan 2M terpelihara pengoptimumanLaluan: arch /riscv/mm/init.c

Ulas semakan penjajaran 2M asal:

Pertempuran praktikal |. RISC-V Linux alamat kemasukan 2M terpelihara pengoptimuman

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);
}
Salin selepas log masuk

Pemetaan jadual halaman keseluruhan kernel ditukar daripada jadual halaman peringkat kedua kepada jadual halaman peringkat ketiga:
Pertempuran praktikal |. RISC-V Linux alamat kemasukan 2M terpelihara pengoptimuman
Andaikan saiz kernel ialah 4M+
Pertempuran praktikal |. RISC-V Linux alamat kemasukan 2M terpelihara pengoptimuman
//定义三个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);
}
Salin selepas log masuk

🎜🎜🎜 🎜🎜Dengan mengubah suai kod di atas, entri Kernel boleh Pindahkan alamat ke hadapan sebanyak 1.5M dan menempah hanya 512KB untuk opensbi, supaya selepas RISC-V Linux bermula, memori fizikal yang tersedia akan meningkat. 🎜. alamat kemasukan mestilah sejajar 2M. Belum ada sesiapa yang memberikan penyelesaian pengoptimuman untuk bahagian memori ini. Saya harap penyelesaian pengoptimuman dalam artikel ini dapat membantu sesetengah orang dan memberi anda sedikit inspirasi.
Pertempuran praktikal |. RISC-V Linux alamat kemasukan 2M terpelihara pengoptimuman

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Meneroka fungsi kernel Linux: pengenalan terperinci kepada lima bahagian utama Meneroka fungsi kernel Linux: pengenalan terperinci kepada lima bahagian utama Mar 21, 2024 am 09:57 AM

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

Adakah sokongan bukan MMU disediakan oleh port uClinux kernel Linux? Adakah sokongan bukan MMU disediakan oleh port uClinux kernel Linux? Jan 26, 2024 pm 05:18 PM

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

Pertempuran praktikal |. RISC-V Linux alamat kemasukan 2M terpelihara pengoptimuman Pertempuran praktikal |. RISC-V Linux alamat kemasukan 2M terpelihara pengoptimuman Aug 01, 2023 pm 03:37 PM

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.

Petua rahsia untuk pengoptimuman tindanan protokol TCP kernel Linux didedahkan Petua rahsia untuk pengoptimuman tindanan protokol TCP kernel Linux didedahkan Jan 28, 2024 am 09:39 AM

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

Linux Kernel: Mendedahkan BOSS Tersembunyi Sistem Pengendalian Komputer Linux Kernel: Mendedahkan BOSS Tersembunyi Sistem Pengendalian Komputer Mar 24, 2024 am 09:10 AM

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

Penerokaan mendalam tentang pengedaran kod sumber kernel Linux Penerokaan mendalam tentang pengedaran kod sumber kernel Linux Mar 15, 2024 am 10:21 AM

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

Terokai hubungan antara sistem Android dan kernel Linux Terokai hubungan antara sistem Android dan kernel Linux Mar 14, 2024 pm 12:48 PM

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

Adakah anda benar-benar tahu bagaimana untuk menyahpepijat kegagalan kernel Linux Anda akan mendapat pencerahan selepas membaca artikel ini! Adakah anda benar-benar tahu bagaimana untuk menyahpepijat kegagalan kernel Linux Anda akan mendapat pencerahan selepas membaca artikel ini! Aug 03, 2023 pm 04:50 PM

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.

See all articles