_start階段
系統(tǒng)時先進(jìn)入_start執(zhí)行。首先判斷cpu核,如果是0號核的話執(zhí)行初始化過程,其它核則執(zhí)行wfe指令進(jìn)入睡眠。初始化的過程如下:
將異常等級轉(zhuǎn)入el1
設(shè)置棧頂指針
清理bss段
初始化mmu的翻譯控制寄存器
設(shè)置內(nèi)核和用戶空間頁表基址寄存器并進(jìn)行初始化階段的頁表設(shè)置,此時將內(nèi)核空間虛擬地址映射為物理地址+0xffff0000000000,用戶空間虛擬地址映射為物理地址+0x40000000。
使能mmu,啟用頁表翻譯地址
使用戶空間頁表基地址寄存器失效(原來設(shè)置該寄存器只為了跳轉(zhuǎn)高地址前的地址翻譯),只用內(nèi)核地址,并設(shè)置棧寄存器為sp_el1
跳轉(zhuǎn)到rtthread_startup
rtthread_startup階段
內(nèi)存相關(guān)初始化過程及內(nèi)存管理初步學(xué)習(xí)
在rt_hw_board_init中進(jìn)行內(nèi)存相關(guān)初始化,這里的目的是設(shè)置表示內(nèi)核空間的相關(guān)全局?jǐn)?shù)據(jù)結(jié)構(gòu),及對內(nèi)存的分布進(jìn)行設(shè)置。
執(zhí)行完該部分后,內(nèi)核地址空間相關(guān)數(shù)據(jù)結(jié)構(gòu)如下:
// 表示內(nèi)核地址空間
struct rt_aspace rt_kernel_space{
.start = 0xffff000000000000; // 內(nèi)核起始地址
.size = 0x1000000000000; // 內(nèi)核地址空間大小
.page_table = MMUTable; // 內(nèi)核所使用的頁表,為變量MMUTable地址
.pgtbl_lock;
.tree.tree.root_node = mpr_varea;
.bst_lock.parent.parent.name = "aspace"; // bst_lock的名字
.asid = 0; // 地址空間id
}
// 表示頁表空間
struct rt_varea mpr_varea{
.start = rt_mpr_start; // 頁元數(shù)據(jù)基址,值為0xfffffdfff0000000
.size = rt_mpr_size; // 頁元數(shù)據(jù)區(qū)域大小,值為0x20000000000
.offset = 0;
.attr = 1536;
.flag = 8704;
.aspace = rt_kernel_space;
.mem_obj = mm_page_mapper; // 內(nèi)存操作接口
.node;
.frames = 0;
.data = 0;
}
init_mpr_align_start = 0xfffffdfff0880000; // 表示頁空間起始頁對應(yīng)的頁元數(shù)據(jù),由于頁元數(shù)據(jù)起始地址(rt_mpr_start)是從0物理地址開始存,所以需要此數(shù)據(jù)
init_mpr_align_end = 0xfffffdfff0900000; // 表示頁空間末尾頁對應(yīng)的頁元數(shù)據(jù)
early_offset = 0xffff020013880000; // 表示的是起始頁與起始頁元數(shù)據(jù)之間距離
mpr_cont = 0xffff000003880000; // 表示的是如果將頁的元數(shù)據(jù)放頁區(qū)域前元數(shù)據(jù)起始位置
head_cont = 0xffff000004102000; // 表示將mpr_cont作為頁元數(shù)據(jù)起始地址后頁區(qū)域首頁對應(yīng)元數(shù)據(jù)位置
tail_cont = 0xffff000004180000; // 表示將mpr_cont作為頁元數(shù)據(jù)起始地址后頁區(qū)域尾頁對應(yīng)元數(shù)據(jù)位置
-
寄存器
+關(guān)注
關(guān)注
31文章
5325瀏覽量
120037 -
MMU
+關(guān)注
關(guān)注
0文章
91瀏覽量
18268 -
控制寄存器
+關(guān)注
關(guān)注
0文章
34瀏覽量
11481 -
RTThread
+關(guān)注
關(guān)注
8文章
132瀏覽量
40811
發(fā)布評論請先 登錄
相關(guān)推薦
評論