新舊核心有所不同
在舊的核心是通過巨集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...