內(nèi)核版本:2.6.22 為什么要采用這樣一個(gè)較低的版本進(jìn)行移植了,因?yàn)?a href="http://m.womende.cn/zhuanti/ivfv10" style="color:#4595e6;" target="_blank">韋東山大牛說了,低版本的才能學(xué)到東西,越是高版本需要移植時(shí)做的工作量越少,學(xué)的東西越少。
內(nèi)核啟動(dòng)分為三個(gè)階段,第一是運(yùn)行head.S文件和head-common.S,第三個(gè)階段是允許第二是運(yùn)行main.c文件
對(duì)于ARM的處理器,內(nèi)核第一個(gè)啟動(dòng)的文件是arc/arm/kernel下面的head.S文件。當(dāng)然arc/arm/boot/compress下面也有這個(gè)文件,這個(gè)文件和上面的文件略有不同,當(dāng)要生成壓縮的內(nèi)核時(shí)zImage時(shí),啟動(dòng)的是后者,后者與前者不同的時(shí),它前面的代碼是做自解壓的,后面的代碼都相同。我們這里這分析arc/arm/kernel下面的head.S文件。當(dāng)head.S所作的工作完成后它會(huì)跳到init/目錄下跌的main.c的start_kernel函數(shù)開始執(zhí)行。
第一階段:
首先截取部分head.S文件
ENTRY(stext)
msr cpsr_c,#PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode
@ andirqs disabled
mrc p15,0, r9, c0, c0 @ get processor id
bl __lookup_processor_type @ r5=procinfo r9=cpuid
movs r10,r5 @ invalidprocessor (r5=0)?
beq __error_p @ yes, error 'p'
bl __lookup_machine_type @ r5=machinfo
movs r8,r5 @ invalidmachine (r5=0)?
beq __error_a @ yes, error 'a'
bl __create_page_tables
/*
*The following calls CPU specific code in a position independent
*manner. See arch/arm/mm/proc-*.S fordetails. r10 = base of
*xxx_proc_info structure selected by __lookup_machine_type
*above. On return, the CPU will be readyfor the MMU to be
*turned on, and r0 will hold the CPU control register value.
*/
ldr r13,__switch_data @ address to jump toafter
@ mmuhas been enabled
adr lr,__enable_mmu @ return (PIC)address
第一步,執(zhí)行的是__lookup_processor_type,這個(gè)函數(shù)是檢查處理器型號(hào),它讀取你的電路板的CPU型號(hào)與內(nèi)核支持的處理器進(jìn)行比較看是否能夠處理。這個(gè)我們不關(guān)心它的具體實(shí)現(xiàn)過程,因?yàn)楝F(xiàn)在主流處理器內(nèi)核都提供了支持。
第二步,執(zhí)行的是__lookup_machine_type,這個(gè)函數(shù)是來檢查機(jī)器型號(hào)的,它會(huì)讀取你bootloader傳進(jìn)來的機(jī)器ID和他能夠處理的機(jī)器ID進(jìn)行比較看是否能夠處理。內(nèi)核的ID號(hào)定義在arc/arm/tool/mach_types文件中MACH_TYPE_xxxx宏定義。內(nèi)核究竟就如何檢查是否是它支持的機(jī)器的呢?實(shí)際上每個(gè)機(jī)器都會(huì)在/arc/arm/mach-xxxx/smdk-xxxx.c文件中有個(gè)描述特定機(jī)器的數(shù)據(jù)結(jié)構(gòu),如下
MACHINE_START(S3C2440,'SMDK2440')
/* Maintainer: Ben Dooks .phys_io =S3C2410_PA_UART, .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc, .boot_params = S3C2410_SDRAM_PA + 0x100, .init_irq =s3c24xx_init_irq, .map_io =smdk2440_map_io, .init_machine = smdk2440_machine_init, .timer =&s3c24xx_timer, MACHINE_END MACHINE_START和 MACHINE_END實(shí)際上被展開成一個(gè)結(jié)構(gòu)體 #defineMACHINE_START(_type,_name) staticconst struct machine_desc __mach_desc_##_type __used __attribute__((__section__('.arch.info.init')))= { .nr =MACH_TYPE_##_type, .name =_name, #defineMACHINE_END }; 于是上面的數(shù)據(jù)結(jié)構(gòu)就被展開為 staticconst struct machine_desc __mach_desc_S3C2440 __used __attribute__((__section__('.arch.info.init')))= { .nr =MACH_TYPE_S3C2440, .name =”SMDK2440”,}; .phys_io = S3C2410_PA_UART, .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc, .boot_params = S3C2410_SDRAM_PA + 0x100, .init_irq =s3c24xx_init_irq, .map_io =smdk2440_map_io, .init_machine = smdk2440_machine_init, .timer =&s3c24xx_timer, } 每個(gè)機(jī)器都會(huì)有一個(gè)machine_desc__mach_desc結(jié)構(gòu),內(nèi)核通過檢查每個(gè)machine_desc__mach_desc的nr號(hào)和bootloader傳上來的ID進(jìn)行比較,如果相同,內(nèi)核就認(rèn)為支持該機(jī)器,而且內(nèi)核在后面的工作中會(huì)調(diào)用該機(jī)器的machine_desc__mach_desc_結(jié)構(gòu)中的方法進(jìn)行一些初始化工作。 第三步,創(chuàng)建一級(jí)頁(yè)表。 第四步,在R13中保存__switch_data 這個(gè)函數(shù)的地址,在第四步使能mmu完成后會(huì)跳到該函數(shù)執(zhí)行。 第五步,執(zhí)行的是__enable_mmu,它是使能MMU,這個(gè)函數(shù)調(diào)用了__turn_mmu_on函數(shù),讓后在_turn_mmu_on在最后將第三步賦給R13的值傳給了PC指針 (mov pc, r13),于是內(nèi)核開始跳到__switch_data這個(gè)函數(shù)開始執(zhí)行。 我們?cè)賮砜碼rch/arm/kenel/head-common.S這個(gè)文件中的__switch_data函數(shù) __switch_data: .long __mmap_switched .long __data_loc @ r4 .long __data_start @ r5 .long __bss_start @ r6 .long _end @ r7 .long processor_id @ r4 .long __machine_arch_type @ r5 .long cr_alignment @ r6 .long init_thread_union+ THREAD_START_SP @ sp /* * The following fragment of code is executedwith the MMU on in MMU mode, * and uses absolute addresses; this is notposition independent. * * r0 =cp#15 control register * r1 = machine ID * r9 = processor ID */ .type __mmap_switched,%function __mmap_switched: adr r3,__switch_data + 4 ldmia r3!,{r4, r5, r6, r7} cmp r4,r5 @ Copy datasegment if needed 1: cmpne r5,r6 ldrne fp,[r4], #4 strne fp,[r5], #4 bne 1b mov fp,#0 @ Clear BSS(and zero fp) 1: cmp r6,r7 strcc fp,[r6],#4 bcc 1b ldmia r3,{r4, r5, r6, sp} str r9, [r4] @ Save processor ID str r1, [r5] @ Save machine type bic r4,r0, #CR_A @ Clear 'A' bit stmia r6,{r0, r4} @ Save controlregister values b start_kernel 這個(gè)函數(shù)做的工作是,復(fù)制數(shù)據(jù)段清楚BBS段,設(shè)置堆在指針,然后保存處理器內(nèi)核和機(jī)器內(nèi)核等工作,最后跳到start_kernel函數(shù)。于是內(nèi)核開始執(zhí)行第二階段。 第二階段: 我們?cè)賮砜磇nit/目錄下的main.c的start_kernel函數(shù),這里我只截圖了部分。 asmlinkage void __init start_kernel(void) { ……………………. …………………….. printk(KERN_NOTICE); printk(linux_banner); setup_arch(&command_line); setup_command_line(command_line); parse_early_param(); parse_args('Booting kernel',static_command_line, __start___param, __stop___param - __start___param,
上一篇:ARM-Linux移植之(二)——Linux2.6.22內(nèi)核移植
下一篇:mini2440內(nèi)核大于2M燒寫方法
推薦閱讀最新更新時(shí)間:2025-06-08 02:40





設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- LTM4602HV 演示板、28V、6A 降壓模塊穩(wěn)壓器
- PCB書簽 尺子 卡片
- PeanutPI
- 平衡自行車+獨(dú)輪車
- AM1DR-1209SZ 9V 1 瓦 DC-DC 轉(zhuǎn)換器的典型應(yīng)用
- NCV33074ADR2G 直流耦合反相放大器最大輸出擺幅的典型應(yīng)用
- 【明日方舟】羅德島本艦主控板V6.2
- DC795A,使用 LT5527EUF 4.5V 至 5.25V 高線性下變頻混頻器的演示板
- XL4016可調(diào)恒壓恒流實(shí)驗(yàn)電源
- 帶內(nèi)部開關(guān)的 PAM2863 2A LED 驅(qū)動(dòng)器的典型應(yīng)用
- 藍(lán)牙m(xù)esh傳感器平臺(tái)可讓OEM 廠商提供專業(yè)的智能照明
- 現(xiàn)代摩比斯將電子動(dòng)力總成系統(tǒng)集成到電動(dòng)汽車底盤中
- 第98屆中國(guó)電子展觀眾實(shí)名預(yù)登記通道現(xiàn)已全面開啟
- 降低85%能耗,IBM和三星的新芯片設(shè)計(jì)有哪些黑科技?
- 單片機(jī)的四種燒寫方式
- 7.靜態(tài)數(shù)碼管
- 新時(shí)間、新地點(diǎn)—慕尼黑上海電子生產(chǎn)設(shè)備展7月全新跨越,精彩起航!
- RIGOL示波器為電源測(cè)量提供有效解決方案
- 驍龍8發(fā)熱拜拜了!iQOO Neo6來襲:跑分輕松破百萬(wàn)
- 方案分享 | ARXML 規(guī)則下 ECU 總線通訊與 ADTF 測(cè)試方案
- 車載SerDes產(chǎn)業(yè)起飛!國(guó)產(chǎn)新品密集炸場(chǎng)
- 出貨量激增1.34倍! 5G車規(guī)模組成標(biāo)配,三大廠商新品同臺(tái)競(jìng)技
- 6月新能源市場(chǎng):零跑創(chuàng)新高;比亞迪海外突破;理想滑坡
- 基于中科芯車規(guī)MCU的LED矩陣大燈應(yīng)用方案
- 蘋果被判侵犯3G專利,需向西班牙公司TOT賠償1.1億美元
- 從設(shè)計(jì)概念到 FPGA 原型僅需數(shù)分鐘,印度 InCore 完成 SoC Generator 平臺(tái)硅驗(yàn)證
- 消息稱因難尋客戶,三星推遲美國(guó)芯片工廠的完工時(shí)間
- BOE(京東方)聯(lián)合榮耀打造榮耀Magic V5 以領(lǐng)先LTPO技術(shù)打造行業(yè)新標(biāo)桿
- 華為ADS 4發(fā)布:多傳感器融合,提升自動(dòng)駕駛安全性
- 電動(dòng)化未來中的機(jī)器人角色
- 傅利葉智能與芝加哥康復(fù)中心達(dá)成戰(zhàn)略合作
- 研發(fā)智能機(jī)器人大腦,「思靈機(jī)器人」完成pre-A輪融資
- 光刻機(jī)領(lǐng)域王者ASML研發(fā)新代機(jī)型,2025年1納米工藝可期
- 未來,一個(gè)芯片搞定導(dǎo)航?
- 磁翻板液位計(jì)有哪些優(yōu)缺點(diǎn)
- 超聲波物位計(jì)應(yīng)用問題詳解
- 遠(yuǎn)傳磁翻板液位計(jì)顯示異常的4種解決方案
- 磁翻板液位計(jì)日常維護(hù)及保養(yǎng)方法
- 磁翻板液位計(jì)的特點(diǎn)和優(yōu)點(diǎn)