ARMLinux内核移植之一内核启动流程分析Word文档下载推荐.docx
- 文档编号:13160075
- 上传时间:2022-10-07
- 格式:DOCX
- 页数:5
- 大小:14.43KB
ARMLinux内核移植之一内核启动流程分析Word文档下载推荐.docx
《ARMLinux内核移植之一内核启动流程分析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ARMLinux内核移植之一内核启动流程分析Word文档下载推荐.docx(5页珍藏版)》请在冰豆网上搜索。
@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();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARMLinux 内核 移植 之一 启动 流程 分析
![提示](https://static.bdocx.com/images/bang_tan.gif)