微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 装载ARM Linux内核启动过程

装载ARM Linux内核启动过程

时间:11-09 来源:互联网 点击:

nd 来判断 bss 的结束位置.

第50行: 因为在第38行的时候,r3被更新到指向第21行的位置.因而这里取得r4, r5, r6, sp的值分别是:

  • r4 - processor_id
  • r5 - machine_arch_type
  • r6 - cr_alignment
  • sp - init_thread_union + THREAD_START_SP

processor_id 和 machine_arch_type 这两个变量是在 arch/arm/kernel/setup.c 中 第62, 63行中定义的. cr_alignment 是在 arch/arm/kernel/entry-armv.S 中定义的:

00182: .globl cr_alignment
00183: .globl cr_no_alignment
00184: cr_alignment:
00185: .space 4
00186: cr_no_alignment:
00187: .space 4

init_thread_union 是 init进程的基地址. 在 arch/arm/kernel/init_task.c 中:

00033: union thread_union init_thread_union
00034: __attribute__((__section__(".init.task"))) =
00035: { INIT_THREAD_INFO(init_task) };

对照 vmlnux.lds.S 中的 的117行,我们可以知道init task是存放在 .data 段的开始8k, 并且是THREAD_SIZE(8k)对齐的

第51行: 将r9中存放的 processor id (在arch/arm/kernel/head.S 75行) 赋值给变量 processor_id

第52行: 将r1中存放的 machine id (见"启动条件"一节)赋值给变量 machine_arch_type

第53行: 清除r0中的 CR_A 位并将值存到r4中. CR_A 是在 include/asm-arm/system.h 21行定义, 是cp15控制寄存器c1的Bit1(alignment fault enable/disable)

第54行: 这一行是存储控制寄存器的值.

从上面 arch/arm/kernel/entry-armv.S 的代码我们可以得知. 这一句是将r0存储到了 cr_alignment 中,将r4存储到了 cr_no_alignment 中.

第55行: 最终跳转到start_kernel

FIN


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top