?? ????? RISC-V Linux ??? ?? ??? ??? ??? ??????. RISC-V Linux ?? ??? 2M ????? ??? ???????. ??? 2M ?? ??? ???? ??? ?? ????????. ???? ??? ??????.
??: ? ??? linux5.10.111 ??? ???? ???.
??? ??? ??
? ?? ???? ??? ? ?? ???? ? ??? ??? ??? ?????. bootrom? 0x0, ? ?? ????. ??? ?? ????? ?? 0x0?? ?????.
RISC-V Linux? ???? ?? ?? opensbi? ???? ??? opensbi? 0x0
處,這樣芯片上電后,就會(huì)從0x0
地址處執(zhí)行opensbi。在opensbi運(yùn)行完后,會(huì)跳轉(zhuǎn)到opensbi運(yùn)行地址偏移2M的位置去執(zhí)行下一級(jí)boot(這里下一級(jí)boot是kernel),即跳轉(zhuǎn)到0x200000
地址處運(yùn)行kernel,因此應(yīng)該把kernel放到內(nèi)存的0x200000
??? ????? ???.
??? ?? ?????? ??? ????.

??? ?? ?? ? ?? ???? ??? ?????(?: 0x200000
) ??? ??? ??? ???? ?????. ??? ???? ?? ??? ??? ??? ????? ??? ?? ???? ???? ? ????. ??? ?? ?? 2M ???? ?????(?: 0x0 - 0x200000
)? ??? ?? ???? ? 2M ???? ?? ??? ???? ???? ????. ?, ??? ? 2M ???? ???? ? ????. 0x200000
)開(kāi)始建立頁(yè)表映射,只有對(duì)物理內(nèi)存建立了頁(yè)表映射,后面才能訪問(wèn)這些內(nèi)存。而kernel加載地址前面的2M內(nèi)存(即0x0 - 0x200000
)將被kernel忽略,不會(huì)對(duì)這2M內(nèi)存建立頁(yè)表,即kernel無(wú)法訪問(wèn)這2M內(nèi)存。
在QEMU上RISC-V Linux的啟動(dòng)信息:

但opensbi實(shí)際不需要使用2M這么大的范圍,默認(rèn)是512KB
,opensbi的pmp會(huì)保護(hù)這512KB
內(nèi)存,不讓其他程序訪問(wèn)。

因此在Kernel和opensbi之間會(huì)存在1.5M
??? opensbi? ??? 2M?? ? ??? ??? ??? ????. ???? 512KB
, opensbi? pmp? ??? ?????512KB
???, ?? ?????? ???? ? ????.
??? 1.5M
??? ?? ? ??? ??? ? ??? ?????? ???? ???? ??? ??? ?????. ??? ??? ???? ?? ??? ????? ?? ??? ??????
??? ??
? 2M ???? ????? ?? ? ?? ??? ????: ???????? 1??: opensbi? ??? ?? ?? ?? ?? ??? ??? 2M ??? ?????. ???????? 2??: Opensbi? ??? ??? ?? ??? ?????. ?? ?? ??? ???? 2M ?? ??? ???? ?? ??? ??? ??? ? ????. ??
Option 1
opensbi? ??? ?? ??? ?? ?? ??? ??? 2M ??? ?????.
?, ??? ??? ??? ????, opensbi? ??? ?????.

?? ?? ??? ???? 0x0
地址處,opensbi放到內(nèi)存的0x10000000
地址處。這樣kernel前面就不會(huì)有預(yù)留內(nèi)存,只不過(guò)這樣需要修改bootrom的地址,將地址從0x0
修改為0x0x10000000
。這種方案只適合芯片還沒(méi)出廠前,因?yàn)橛脩?hù)無(wú)法修改bootrom的地址,芯片出廠后,bootrom地址是固定的,假設(shè)bootrom地址為0x0
,那么芯片上電后,就會(huì)從0x0
開(kāi)始運(yùn)行程序,所以opensbi必須放到0x0
??? ????? ??? 2M?? ??????.
?? 2
?? RISC-V Linux? ?? ?? ??? ???? 2M ?? ??? ??? ?? ????. setup_vm ()
??? ???? ?? ? ?? ?? ??? ???? ? ?? ?? ??? ???? ???? ?? ?? ??? 4K?? ???? ??? ??? ???? ?? ???? ?????. setup_vm()
函數(shù)中,將原來(lái)的二級(jí)頁(yè)表改為三級(jí)頁(yè)表,這樣kernel入口地址只需要4K對(duì)齊,因此就能將kernel往前挪,從而利用前面的內(nèi)存。
修改代碼
路徑:arch/riscv/mm/init.c
?? ??

?? / riscv/mm/init.c
?? 2M ?? ??? ??? ?????.

? ?? ?? ??? ????? ? ?? ?? ??? ???? ??? ? ?? 2M ??? ??? ??? ?????.
//新增一個(gè)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); }
?? ??? ??? ??? ??? 2?? ??? ????? 3?? ??? ???? ?????.


//定義三個(gè)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); }????????? ?????. ??? ??? ???? ?? ??? 1.5M ??? ???? opensbi??? 512KB? ??? ? ????. ?? ??? RISC-V Linux? ??? ? ?? ??? ??? ???? ?????. ??

Summary
RISC-V Linux ?? ?? 2M ?? ??? ?? ???? ???? opensbi? ?? 2M? ???? ??? ??? ?? ??? ???? ????? ?? ??? 2M? ????? ???. ???? ???? ? ??? ?? ??? ???? ??? ??? ????. ? ??? ??? ???? ?? ????? ??? ?? ?? ???? ??? ? ? ??? ????.
? ??? ???? ?? | RISC-V Linux ?? ?? 2M ?? ??? ???? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)

?? ??? ?? ??? Linux ??? ???? ?? ?? ? ??? ?? ??? ?? ??? ??? ?????. ? ????? ???? ??, ?? ???, ???? ??, ?? ???? ? ??? ??? ???? Linux ??? ?? ?? ?? ??? ???? ??? ??? ?? ??? ?????. 1. ???? ?? ???? ?? Linux ???? ???? ??? fork() ??? ??? ?? ?????. ??? ??? ?? ?????: #include

??? Linux ?? ?? ?? ??? ????? ???? 1500 ?? ??? ?????. ??? ???? ?? Linux ?? ?? ??? ?? ??? ??? ?? ??? ??? ?? ?? ? ?? ???? ?? ??? ?????. Linux ??? ?? ??? GitHub?? ????? ?? ?? ?? ?? ?????. ?? Linux ?? ?? ?? ???? ?? ???? ?? ?? ??? ? ??? ??? ??? ?? ??? ?????. Linux ?? ?? ??? ? ?? ?????

??? ?? ???? ??? ?? ??? ???? ????? ?? ?? ??? ????. ??: Linux ?? ???? ??? ???? ????? ?????? ????? ?? ????? ??? ? ????. ??? ???? Linux ?? ?? ???? ??? ???? ???? ?? ??, ????, ???, ?? ???? ? ?? ?? ??? ?????. ??? ?? ???? ???? ???????? ??? ????? ??? ? ????. ??? ?? ??? ???? ?????? Linux ??? "??" ?? "??"?? ???. Linux ??? ?? ??(?? ?? ??)? ???? ??, CPU ? ???? ??, ?? ???, ?? ?? ? ????, ???? ?? Linux ??, ??? ?? ???? ????.

?? ????? RISC-V Linux ??? ?? ??? ??? ??? ??????. RISC-V Linux ?? ??? 2M ????? ??? ???????. ??? 2M ?? ??? ???? ???? ??? ????? ??? ?? ???????. ??.

Linux ??? ??? ?? ???? ??? ??? ??? ??? ?????. Linux ?? ?? ? ?? ?? ????? ?? ???? ??? ?? ? ???? Linux ??? ??? ??? ???? ?????. 1. ???? ??? ?? ?? ??? ?? ??? ???? Linux ??? ??? ?? ? ???? ????? ??? ? ????. ?? ??? ????? ???? Linux ??? ??? ???? ?? ??? ?? ?? ??? ???? ????? ?? ? ???????. ??????? ?? ?? ??? ?? ???? ??? ? ???? ?? ??? ??? ?????. 2. ??? ???? ?? ??? ??? ?? ??? ??? ???? ?? ????? ?? ????? ???? ??? ? ??? ???. ???? ???

?????, ?? ???! ??? ?? Linux ?? TCP ???? ??? ?? ? ??? ???? ???? ??? ???? ?? ???? ?????? ??? ??? ??? ??? ???? ???? ? ?? ???? ?????. ? ?? ?? ??? ?? ??? ??? ? ???, ? ??? ? ??? ??? ??? ?? ??? ?? ?? ????? ????? ??? ?? ??? ??? ? ??? ????. 1. TCP ?? ?? TCP ?? ??? TCP ???? ??? ?? ??????? ?? ?? ??? ???? ?? ?? ?? ????. ???? ???? ????? ???? ? SYN ??? ?? ??(??? ???? ??) ? ???? ?? ??(?, TCPFastOp ??)? ???? ? ?? ????? ???? ??? ?? ??? ??????.

Android ???? Linux ??? ???? ??? ? ????, ? ??? ??? ???? ?????. Android ????? Linux ??? Android ???? ?? ?? ???? ???? ? ??? ?? ??? ???? ??? ??? ???. ? ????? Android ???? Linux ?? ?? ??, ?? ?? ? ?? ??? ???? ? ?? ???? ?? ??? ?????. ?????(Android)? ??? ??? ???? ??? ??? ????? ????, ??? ? ??? ??? ?? ????. ?

Linux ??? ?? ??? ???? CPU, I/O ??, ??? ??? ? ?? ???? ?? ??? ???? ?? ???? ?????. ?? ??? ???? ???? ?? ??? ?? ? ??? ??? ???? ???. ??? ????? ??? ??? ?? ??? ??? ?????.
