ARM LINUX核心如何確定自己的實際實體地址

2021-08-03 02:48:52 字數 4193 閱讀 2728

新舊核心有所不同

在舊的核心是通過巨集kernel_ram_paddr來確定

.macro    pgtbl, rd  

ldr   \rd, =(kernel_ram_paddr - 0x4000)  

.endm  

__create_page_tables:  

/* r4 = kernel_ram_paddr – 0x4000 = 0x30004000

* 記憶體位址,不過它的值是虛擬記憶體位址,即0xc0004000

*/pgtbl       r4                         @ page table address  

/* 將從r4到kernel_rap_paddr的16k頁表空間清空。 */

在新的核心中建立臨時頁表的時候,得到實際的物理記憶體位址是通過計算得到的,見下面加粗字型

44         .macro  pgtbl, rd, phys

45         add     \rd, \phys, #text_offset - 0x4000

46         .endm

48 #ifdef config_xip_kernel

49 #define kernel_start    xip_virt_addr(config_xip_phys_addr)

50 #define kernel_end      _edata_loc

51 #else

52 #define kernel_start    kernel_ram_vaddr

53 #define kernel_end      _end

54 #endif

139 __create_page_tables:   @r8是實際的實體地址 r4是16k頁表大小。

140         pgtbl   r4, r8            @ page table address通過巨集 pgtbl 將r4設定成頁表的基位址(實體地址),巨集pgtbl 在 arch/arm/kernel/head.s第44定義,可以看到,頁表是位於 text_offset下面 16k 的位置,r4 =  0x30004000 這是轉換表的物理基位址,最終將寫入cp15 的暫存器 2 , c2 。這個值必須是 16k 對齊的。

141 

74         __head

75 entry(stext)

76         setmode psr_f_bit | psr_i_bit | svc_mode, r9 @ 確保進入管理(svc)模式

77                                               @ 並且禁止中斷

78         mrc     p15, 0, r9, c0, c0              @ 讀取cpu id,存入r9暫存器

79         bl      __lookup_processor_type      @ 呼叫函式,輸入引數r9=cpuid,

@ 返回值r5=procinfo 

80         movs    r10, r5                       @ 如果不支援當前cpu,則返回 (r5=0)

81  thumb( it      eq )            @ force fixup-able long branch encoding

82         beq     __error_p                       @ 如果r5=0,則列印錯誤

83 84 #ifndef config_xip_kernel   

@ 在呼叫__enable_mmu前使用的都是實體地址,而核心卻是以虛擬地 址連線的,這裡進行一次轉換

85         adr     r3, 2f              @ r3= 第124行**的實體地址

86         ldmia   r3,          @ r4= 第124行**的虛似位址,r8=page_offset

87         sub     r4, r3, r4     @ (phys_offset - page_offset)即實體地址與虛似位址差值

88         add     r8, r8, r4     @ phys_offset r8=page_offset對應的實體地址

89 #else

90         ldr     r8, =plat_phys_offset    @ 

ram的起始實體地址,值為0x30000000

91 #endif

92 93         /*

94          * r1 = machine no, r2 = atags or dtb,

95          * r8 = phys_offset, r9 = cpuid, r10 = procinfo

96          */

97         bl      __vet_atags  @ 檢查bootloader傳入的引數列表atags的合法性

98 #ifdef config_smp_on_up   @ 2410沒有定義

99         bl      __fixup_smp

100 #endif

101 #ifdef config_arm_patch_phys_virt  @ 2410沒有定義

102         bl      __fixup_pv_table

103 #endif

在2.6.39版本前,還增加了__lookup_machine_type板級型別支援的檢查,這裡已經被取消,卻增加了84-91行的**,並且除第97行外,其它有些是沒有的,

104         bl      __create_page_tables  @建立初始頁表

105 

106         /*

107          * the following calls cpu specific code in a position independent

108          * manner.  see arch/arm/mm/proc-*.s for details.  r10 = base of

109          * ***_proc_info structure selected by __lookup_processor_type

110          * above.  on return, the cpu will be ready for the mmu to be

111          * turned on, and r0 will hold the cpu control register value.

112          */

113         ldr     r13, =__mmap_switched    @ 將列表__switch_data存到r13中後面會跳到該列表出

114                                          @ mmu has been enabled

115         adr     lr, bsym(1f)  @ return (pic) address將程式段 __enable_mmu的位址存到 lr中。 

@ r10中存放的基位址是從__lookup_processor_type中得到的,如上面movs r10, r5

117  arm(   add     pc, r10, #procinfo_initfunc     )

118  thumb( add     r12, r10, #procinfo_initfunc    )

119  thumb( mov     pc, r12                         )

120 1:      b       __enable_mmu

121 endproc(stext)

122         .ltorg

123 #ifndef config_xip_kernel

124 2:      .long   .   @ "."號表示當前這行**編譯連線後的虛似位址

編譯arm linux核心

這一次寫一下編譯 arm核心以及根檔案系統的體驗,我使用的是 linux 2.6.30.4 的核心,通過 第一步 解壓原始檔 tar jxvf linux 2.6.30.4.tar.bz2 c opt 下。第二步 更改主目錄下 makefile 檔案,使其支援 arm架構。在 193行的 arch ...

arm linux 核心生成過程

1.依據arch arm kernel vmlinux.lds 生成linux核心原始碼根目錄下的vmlinux,這個vmlinux屬於未壓縮,帶除錯資訊 符號表的最初的核心,大小約23mb arm linux gnu ld el p no undefined x o vmlinux t arch ...

ARM Linux 2 6 34核心移植

arm linux gcc版本4.3.2.以安裝在 usr local arm 4.3.2下.第一步 修改linux 2.6.34 makefile檔案,在makefile中找到以下兩條資訊並做修改 arch arm cross compile usr local arm 4.3.2 bin arm...