_start階段
系統時先進入_start執行。首先判斷cpu核,如果是0號核的話執行初始化過程,其它核則執行wfe指令進入睡眠。初始化的過程如下:
將異常等級轉入el1
設置棧頂指針
清理bss段
初始化mmu的翻譯控制寄存器
設置內核和用戶空間頁表基址寄存器并進行初始化階段的頁表設置,此時將內核空間虛擬地址映射為物理地址+0xffff0000000000,用戶空間虛擬地址映射為物理地址+0x40000000。
使能mmu,啟用頁表翻譯地址
使用戶空間頁表基地址寄存器失效(原來設置該寄存器只為了跳轉高地址前的地址翻譯),只用內核地址,并設置棧寄存器為sp_el1
跳轉到rtthread_startup
rtthread_startup階段
內存相關初始化過程及內存管理初步學習
在rt_hw_board_init中進行內存相關初始化,這里的目的是設置表示內核空間的相關全局數據結構,及對內存的分布進行設置。
執行完該部分后,內核地址空間相關數據結構如下:
// 表示內核地址空間
struct rt_aspace rt_kernel_space{
.start = 0xffff000000000000; // 內核起始地址
.size = 0x1000000000000; // 內核地址空間大小
.page_table = MMUTable; // 內核所使用的頁表,為變量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; // 頁元數據基址,值為0xfffffdfff0000000
.size = rt_mpr_size; // 頁元數據區域大小,值為0x20000000000
.offset = 0;
.attr = 1536;
.flag = 8704;
.aspace = rt_kernel_space;
.mem_obj = mm_page_mapper; // 內存操作接口
.node;
.frames = 0;
.data = 0;
}
init_mpr_align_start = 0xfffffdfff0880000; // 表示頁空間起始頁對應的頁元數據,由于頁元數據起始地址(rt_mpr_start)是從0物理地址開始存,所以需要此數據
init_mpr_align_end = 0xfffffdfff0900000; // 表示頁空間末尾頁對應的頁元數據
early_offset = 0xffff020013880000; // 表示的是起始頁與起始頁元數據之間距離
mpr_cont = 0xffff000003880000; // 表示的是如果將頁的元數據放頁區域前元數據起始位置
head_cont = 0xffff000004102000; // 表示將mpr_cont作為頁元數據起始地址后頁區域首頁對應元數據位置
tail_cont = 0xffff000004180000; // 表示將mpr_cont作為頁元數據起始地址后頁區域尾頁對應元數據位置
-
寄存器
+關注
關注
31文章
5363瀏覽量
120915 -
MMU
+關注
關注
0文章
91瀏覽量
18333 -
控制寄存器
+關注
關注
0文章
34瀏覽量
11507 -
RTThread
+關注
關注
8文章
132瀏覽量
40957
發布評論請先 登錄
相關推薦
評論