ARMLinux内核移植之一内核启动流程分析Word文档下载推荐.docx

上传人:b****1 文档编号:13160075 上传时间:2022-10-07 格式:DOCX 页数:5 大小:14.43KB
下载 相关 举报
ARMLinux内核移植之一内核启动流程分析Word文档下载推荐.docx_第1页
第1页 / 共5页
ARMLinux内核移植之一内核启动流程分析Word文档下载推荐.docx_第2页
第2页 / 共5页
ARMLinux内核移植之一内核启动流程分析Word文档下载推荐.docx_第3页
第3页 / 共5页
ARMLinux内核移植之一内核启动流程分析Word文档下载推荐.docx_第4页
第4页 / 共5页
ARMLinux内核移植之一内核启动流程分析Word文档下载推荐.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

ARMLinux内核移植之一内核启动流程分析Word文档下载推荐.docx

《ARMLinux内核移植之一内核启动流程分析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ARMLinux内核移植之一内核启动流程分析Word文档下载推荐.docx(5页珍藏版)》请在冰豆网上搜索。

ARMLinux内核移植之一内核启动流程分析Word文档下载推荐.docx

@andirqsdisabled

mrc p15,0,r9,c0,c0 @getprocessorid

bl __lookup_processor_type @r5=procinfor9=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

/*

*ThefollowingcallsCPUspecificcodeinapositionindependent

*manner.Seearch/arm/mm/proc-*.Sfordetails.r10=baseof

*xxx_proc_infostructureselectedby__lookup_machine_type

*above.Onreturn,theCPUwillbereadyfortheMMUtobe

*turnedon,andr0willholdtheCPUcontrolregistervalue.

*/

ldr r13,__switch_data @addresstojumptoafter

@mmuhasbeenenabled

adr lr,__enable_mmu @return(PIC)address

第一步,执行的是__lookup_processor_type,这个函数是检查处理器型号,它读取你的电路板的CPU型号与内核支持的处理器进行比较看是否能够处理。

这个我们不关心它的具体实现过程,因为现在主流处理器内核都提供了支持。

第二步,执行的是__lookup_machine_type,这个函数是来检查机器型号的,它会读取你bootloader传进来的机器ID和他能够处理的机器ID进行比较看是否能够处理。

内核的ID号定义在arc/arm/tool/mach_types文件中MACH_TYPE_xxxx宏定义。

内核究竟就如何检查是否是它支持的机器的呢?

实际上每个机器都会在/arc/arm/mach-xxxx/smdk-xxxx.c文件中有个描述特定机器的数据结构,如下

MACHINE_START(S3C2440,"

SMDK2440"

/*Maintainer:

BenDooks<

ben@fluff.org>

*/

.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实际上被展开成一个结构体

#defineMACHINE_START(_type,_name) \

staticconststructmachine_desc__mach_desc_##_type \

__used \

__attribute__((__section__("

.arch.info.init"

)))={ \

.nr =MACH_TYPE_##_type, \

.name =_name,

#defineMACHINE_END \

};

于是上面的数据结构就被展开为

staticconststructmachine_desc__mach_desc_S3C2440 \

.nr =MACH_TYPE_S3C2440, \

.name =”SMDK2440”,};

.phys_io =S3C2410_PA_UART,

}

每个机器都会有一个machine_desc__mach_desc结构,内核通过检查每个machine_desc__mach_desc的nr号和bootloader传上来的ID进行比较,如果相同,内核就认为支持该机器,而且内核在后面的工作中会调用该机器的machine_desc__mach_desc_结构中的方法进行一些初始化工作。

第三步,创建一级页表。

第四步,在R13中保存__switch_data 这个函数的地址,在第四步使能mmu完成后会跳到该函数执行。

第五步,执行的是__enable_mmu,它是使能MMU,这个函数调用了__turn_mmu_on函数,让后在_turn_mmu_on在最后将第三步赋给R13的值传给了PC指针 (mov pc,r13),于是内核开始跳到__switch_data这个函数开始执行。

我们再来看arch/arm/kenel/head-common.S这个文件中的__switch_data函数

__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

/*

*ThefollowingfragmentofcodeisexecutedwiththeMMUoninMMUmode,

*andusesabsoluteaddresses;

thisisnotpositionindependent.

*

*r0=cp#15controlregister

*r1=machineID

*r9=processorID

.type __mmap_switched,%function

__mmap_switched:

adr r3,__switch_data+4

ldmia r3!

{r4,r5,r6,r7}

cmp r4,r5 @Copydatasegmentifneeded

1:

cmpne r5,r6

ldrne fp,[r4],#4

strne fp,[r5],#4

bne 1b

mov fp,#0 @ClearBSS(andzerofp)

cmp r6,r7

strcc fp,[r6],#4

bcc 1b

ldmia r3,{r4,r5,r6,sp}

str r9,[r4] @SaveprocessorID

str r1,[r5] @Savemachinetype

bic r4,r0,#CR_A @Clear'

A'

bit

stmia r6,{r0,r4} @Savecontrolregistervalues

b start_kernel

这个函数做的工作是,复制数据段清楚BBS段,设置堆在指针,然后保存处理器内核和机器内核等工作,最后跳到start_kernel函数。

于是内核开始执行第二阶段。

第二阶段:

我们再来看init/目录下的main.c的start_kernel函数,这里我只截图了部分。

asmlinkagevoid__initstart_kernel(void)

{

…………………….

……………………..

printk(KERN_NOTICE);

printk(linux_banner);

setup_arch(&

command_line);

setup_command_line(command_line);

parse_early_param();

parse_args("

Bootingkernel"

static_command_line,__start___param,

__stop___param-__start___param,

&

unknown_bootoption);

……………………

…………………………

init_IRQ();

pidhash_init();

init_timers();

hrtimers_init();

softirq_init();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1