1.如果內核鏡像是壓縮的,需要解壓縮,引導的第一步是從解壓縮開始:archarmbootcompressedhead.S
2.解壓縮之后,內核鏡像已經存在于ARM中了,下面開始運行,內核開始運行是從/arch/arm/kernel/head.S開始的,入口代碼為:
1 2 3 4 5 6 7 8 | .arm __HEAD ENTRY(stext)
THUMB( adr r9, BSYM(1f) ) @ Kernel is always entered in ARM. THUMB( bx r9 ) @ If this is a Thumb-2 kernel, THUMB( .thumb ) @ switch to Thumb now. THUMB(1: ) |
這是由/arch/arm/kernel/vmlinux.lds.S決定的。告訴我們入口點為stext.
1 2 | OUTPUT_ARCH(arm) ENTRY(stext) |
3.順序執行head.S的代碼。
1 2 3 4 5 6 7 8 | ldr r13, =__switch_data @ address to jump to after @ mmu has been enabled adr lr, BSYM(1f) @ return (PIC) address mov r8, r4 @ set TTBR1 to swapper_pg_dir ARM( add pc, r10, #PROCINFO_INITFUNC ) THUMB( add r12, r10, #PROCINFO_INITFUNC ) THUMB( mov pc, r12 ) 1: b __enable_mmu |
代碼line1將__switch_data的地址賦給r13,在__enable_mmu(代碼line8)執行成功后跳轉到__switch_data執行。
因為是.arm環境,所以執行代碼ARM( add pc, r10, #PROCINFO_INITFUNC ),即跳轉到__cpu_flush執行。
1 2 3 4 | /arch/arm/kernel/head.S mrc p15, 0, r9, c0, c0 @ get processor id bl __lookup_processor_type @ r5=procinfo r9=cpuid movs r10, r5 @ invalid processor (r5=0)? |
r10中保存的是proc_info結構體的start address.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | archarmincludeasmProcinfo.h struct proc_info_list { unsigned int cpu_val; unsigned int cpu_mask; unsigned long __cpu_mm_mmu_flags; /* used by head.S */ unsigned long __cpu_io_mmu_flags; /* used by head.S */ unsigned long __cpu_flush; /* used by head.S */ const char *arch_name; const char *elf_name; unsigned int elf_hwcap; const char *cpu_name; struct processor *proc; struct cpu_tlb_fns *tlb; struct cpu_user_fns *user; struct cpu_cache_fns *cache; }; |
1 2 | include/generated/asm-offsets.h #define PROCINFO_INITFUNC 16 |
4.__cpu_flush
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | arch/arm/mm/proc-v7.S
__v7_ca9mp_proc_info: .long 0x410fc090 .long 0xff0ffff0 __v7_proc __v7_ca9mp_setup
.macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0 ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | PMD_SECT_AF | PMD_FLAGS_SMP | mm_mmuflags) ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | PMD_SECT_AF | PMD_FLAGS_UP | mm_mmuflags) .long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | PMD_SECT_AF | io_mmuflags W(b) initfunc
__v7_ca5mp_setup: __v7_ca9mp_setup: mov r10, #(1 << 0) @ TLB ops broadcasting b 1f __v7_ca7mp_setup: __v7_ca15mp_setup: mov r10, #0 |
不同架構的CPU,針對的文件不同,對于ARMV7架構的cpu而言,對應的為proc-v7.S。從code中可以看出,其對應俄proc_info為__v7_ca9mp_proc_info,所以偏移16后,就是執行跳轉代碼 b 1f。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | __CPUINIT
/* * __v7_setup * * Initialise TLB, Caches, and MMU state ready to switch the MMU * on. Return in r0 the new CP15 C1 control register setting. * * This should be able to cover all ARMv7 cores. * * It is assumed that: * - cache type register is implemented */ __v7_ca5mp_setup: __v7_ca9mp_setup: mov r10, #(1 << 0) @ TLB ops broadcasting b 1f __v7_ca7mp_setup: __v7_ca15mp_setup: mov r10, #0 1: #ifdef CONFIG_SMP ALT_SMP(mrc p15, 0, r0, c1, c0, 1) ALT_UP(mov r0, #(1 << 6)) @ fake it for UP tst r0, #(1 << 6) @ SMP/nAMP mode enabled? orreq r0, r0, #(1 << 6) @ Enable SMP/nAMP mode orreq r0, r0, r10 @ Enable CPU-specific SMP bits mcreq p15, 0, r0, c1, c0, 1 #endif __v7_setup: |
5.__v7_setup->__enable_mmu->__turn_mmu_on
1 2 3 4 5 6 7 8 | __turn_mmu_on: mov r0, r0 mcr p15, 0, r0, c1, c0, 0 @ write control reg mrc p15, 0, r3, c0, c0, 0 @ read id reg mov r3, r3 mov r3, r3 mov pc, r13 ENDPROC(__turn_mmu_on) |
r13保存的是__switch_data的地址,mov pc,r13跳轉到__switch_data.
6.__mmap_switched
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | .type __switch_data, %object __switch_data: .long __mmap_switched .long __data_loc @ r4 .long _data @ r5 .long __bss_start @ r6 .long _end @ r7 .long processor_id @ r4 .long __machine_arch_type @ r5 .long __atags_pointer @ r6 關鍵字:ARMv7 Linux Kernel 內核鏡像 引用地址:ARMv7:Linux Kernel引導
上一篇:S5PV210的LED應用(一) 0
推薦閱讀 日本經濟新聞(中文版:日經中文網)獲悉,正在進行經營重建的日本顯示器公司(JDI)討論籌集約500億日元規模的資金。 除了實施超過300億日元的第三方配股增資外,還將通過出售資產等舉措籌集資金。 計劃接受日本國內外多家投資基金的出資。 面向美國蘋果公司預定今年秋季上市的新款智能手機用液晶面板,日本顯示器獲得了大量訂單。 將把籌集的資金用...
如今,我國將機器人視為“制造業皇冠頂端的明珠”。為改善人口紅利因素帶來的現有生產力不足,促進制造業水平從大國向強國邁進,推動國家綜合實力和經濟發展水平提升,我國正在大力推動機器人產業發展。
2019年深圳機器人產業發展優勢淺析
2014年,伴隨著“中國制造2025”這一概念的提出,我國確立了三步走的制造強國戰略,機器人作為其中一環,其發...
1.向量中斷概述S5PC100集成了3個向量中斷控制器(后文用VIC來表示),采用的是ARM基于PrimeCell技術下的PL192核心,另外還包括了3個TZIC,即針對于TrustZone技術所涉及的中斷控制器(后文都用TZIC表示),其核心為SP890。S5PC100下支持94個中斷源,其中TZIC為TrustZone單獨設計以了一個安全軟件中斷接口,它提供了基于安全控制技術的nFIQ中斷以及屏蔽來自非...
3月29日下午,國家科技部黃衛副部長一行在澳門特區政府經濟及科技發展局代表謝永強廳長陪同下對芯耀輝科技(澳門)有限公司(以下簡稱“芯耀輝”)進行實地調研考察,聽取了芯耀輝澳門負責人、集團聯席CEO余成斌教授及集團董事長兼聯席CEO曾克強對企業科技創新成果、澳門集成電路產業發展以及澳珠產業合作的情況介紹,勉勵企業充分發揮技術優勢,集成創新...
史海拾趣 Hei Inc Optoelectronic Division公司的發展小趣事
市場上存在多種數字定時器芯片,它們具有高精度、可編程性強等優點。通過配置定時器芯片的參數,可以方便地實現定時加熱功能,并可以根據需要進行調整。
EETools公司的發展小趣事
隨著技術的不斷進步和市場的變化,EETools意識到必須不斷創新才能保持競爭力。公司投入大量研發資源,對嵌入式開發工具進行技術升級和產品優化。經過數年的努力,EETools成功推出了一系列具有領先技術的嵌入式開發工具,如高性能的芯片編程器、智能調試器等。這些產品不僅提高了客戶的工作效率,還降低了成本,贏得了市場的廣泛認可。 GarrettCom公司的發展小趣事
研發:GarrettCom(現為Belden的一部分)始終將技術創新作為企業發展的核心驅動力。公司不斷投入研發資源,致力于開發更加先進、可靠的工業網絡通信產品。通過持續的技術創新,GarrettCom不僅推動了工業通信技術的進步,還為客戶提供了更加高效、便捷的通信解決方案。 應用:這些創新產品被廣泛應用于工業自動化、交通監控、能源管理等多個領域,為客戶創造了巨大的價值。同時,GarrettCom還積極參與國際標準的制定和推廣工作,為行業的標準化發展做出了積極貢獻。 Cretex Companies Inc公司的發展小趣事
為了降低成本、提高生產效率,Cretex開始對產業鏈進行整合與優化。他們與上游供應商建立長期穩定的合作關系,確保原材料的穩定供應和質量可靠。同時,公司還加強了對下游客戶的服務與支持,通過提供個性化的解決方案和優質的售后服務,增強了客戶黏性。這些舉措使得Cretex在激烈的市場競爭中保持了領先地位。 American Power Devices Inc公司的發展小趣事
在電子行業的初期,APD公司憑借其卓越的技術研發團隊,成功開發出了一款高效能的電源管理芯片。這款芯片以其低能耗、高穩定性等特點迅速獲得了市場的認可。隨著技術的不斷迭代和更新,APD持續投入研發,推出了一系列具有競爭力的產品,逐漸在電源管理領域樹立了領先地位。 AverLogic公司的發展小趣事
AverLogic公司在電子行業中以其技術創新和產品突破而嶄露頭角。在早期的發展階段,公司專注于研發高質量的視頻處理芯片,以滿足市場對于更高清晰度和更流暢視頻播放的需求。經過多次實驗和迭代,公司成功推出了一款具有革命性的轉換器產品——AL110,這款產品能夠將PC和Macintosh的VGA信號轉換為高品質的NTSC或PAL信號,從而極大地提升了視頻信號的處理效率和輸出品質。這一創新不僅為公司贏得了市場的認可,也為公司在電子行業中奠定了堅實的基礎。
小廣播
推薦內容
熱門活動
換一批 更多
設計資源 培訓 開發板 精華推薦
最新單片機文章
更多精選電路圖
更多每日新聞
更多往期活動
04月10日歷史上的今天
廠商技術中心
| ||||||||||