ARM平台device tree是如何工作的?(一)
2016-05-31 16:14
501 查看
bootloader传递给内核的参数
在bootloader启动kernel之前会设置ARM CPU的r0,r1,r2,r9寄存器:未使用device tree的2.6版本中,只需要将:
r0=0;
r1=machine_id;
r2=atags_address;
使用device tree之后,就稍微复杂一些,设置如下:
r0=cp#15 control register;
r1=machine ID;
r2=atags/dtb pointer;
r9=processor ID;
在arm/arm/kernel/head-common.S中,汇编代码会将这几个寄存器的值保存到几个变量中。
/* * The following fragment of code is executed with the MMU on in MMU mode, * and uses absolute addresses; this is not position independent. * * r0 = cp#15 control register * r1 = machine ID * r2 = atags/dtb pointer * r9 = processor ID */ __INIT __mmap_switched: adr r3, __mmap_switched_data ldmia r3!, {r4, r5, r6, r7} cmp r4, r5 @ Copy data segment 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 ARM( ldmia r3, {r4, r5, r6, r7, sp}) THUMB( ldmia r3, {r4, r5, r6, r7} ) THUMB( ldr sp, [r3, #16] ) str r9, [r4] @ Save processor ID str r1, [r5] @ Save machine type str r2, [r6] @ Save atags pointer cmp r7, #0 strne r0, [r7] @ Save control register values b start_kernel ENDPROC(__mmap_switched) .align 2 .type __mmap_switched_data, %object __mmap_switched_data: .long __data_loc @ r4 .long _sdata @ r5 .long __bss_start @ r6 .long _end @ r7 .long processor_id @ r4 .long __machine_arch_type @ r5 .long __atags_pointer @ r6 #ifdef CONFIG_CPU_CP15 .long cr_alignment @ r7 #else .long 0 @ r7 #endif .long init_thread_union + THREAD_START_SP @ sp .size __mmap_switched_data, . - __mmap_switched_da
上述代码做了三件事:
1、如果需要,保存数据段信息到
__data_loc,
_sdata,
__bss_start和
_end变量中;
2、保存r9寄存器的值,即processor ID到
processor_id变量中,保存r1寄存器的值,即machine ID到
__machine_arch_type中,保存r2寄存器的值,即atags或dtb的地址到
__atags_pointer变量中;
3、跳转到start_kernel()这个函数中去执行;
start_kernel()这个函数是C代码实现的。
相关文章推荐
- #新闻拍一拍# IBM 招聘广告要求应聘者具备至少 12 年 K8S 使用经验
- 神器SystemTap
- vivi下重新调整分区
- ARM Linux系统启动
- Linux及ARM Linux程序开发笔记(零基础入门篇)
- 零基础入门篇之Linux及Arm-Linux程序开发笔记
- 解读Linux安全机制之栈溢出保护
- 簡單設定 kernel 選項在使用 iptables 前
- Ubuntu12.04内核升级出了问题
- [Linux学习笔记] Linux系统引导流程(一)
- 我的 ARM+Linux 学习路线
- 64位Ubuntu 14.04上使用musleabi最小化交叉编译Android版PHP7
- 更新Debian内核e1000e驱动模块
- Linux Kernel 4.5在3月15日发布最终版
- 关于ARM启动的一篇文章
- ARM 的堆栈初始化详解
- ARM条件码与CPSR标志位的关系
- 加载/存储指令
- 关于ARM 汇编的一些疑问
- ARM汇编伪指令介绍