ARM Linux启动过程学习

 linux根目录中的vmlinux.o为arm-linux-ld link得到的一个elf格式的文件,这个文件包含kernel下的head.o+driver+MM+FS+net等其他

o文件。

 

使用kernel目录下的vmlinux.lds link脚本生成vmlinux elf格式的可执行文件

 

Vmlinux使用arm-linux-objcopy生成bin格式的文件 image。仅仅包含指令和数据。

可以loadsdram0x30008000地址运行。为什么非要load到这个地址呢?通过跟踪

Head.S执行,发现在__lookup_machine_type函数中,如果load地址不是0x30008000,

Ldmia r3, {r4, r5, r6}会出现错误,r4的内容出现错误

 

为了分析linux启动过程,生成一个最小的kernel,然后使用AXD+JTAG来进行单步跟踪

 

生成一个tiny kernel 使用axd跟踪 500Kbin文件,load0x30008000地址进行跟踪

首先执行的代码为compressed head.S中的start.S unzip了一些代码,重新放入0x30008000,然后再次从0x30008000地址重新执行新的代码

 

问了得到kernel中的函数虚拟地址,需要生成system.map文件。

下面的命令可以得到system.map

NM=arm-linux-nm  /bin/sh /hdd/linux-2.6.28/scripts/mksysmap vmlinux System.map

 

ARM Linux启动过程:

 

CPU执行kernel中的第一个指令之前,bootloader必须完成一些工作:

1 初始化CPU进入SVC模式 关闭IRQ/FIQ disable

2 初始化一个串口 kernel会输出调试信息

 

Kernel中的head.S流程:

确保ARM CPU运行在SVC模式并且IRQ disable

从协处理器中得到CPUID

Bl指令调用__lookup_processor_type函数查找proc info lds link脚本根据autoconf.h中配置的CPU类型,把proc-arm920.S文件中的信息存放到__proc_info_begin__proc_info_end之间,根据CPUID查找CPU类型是否支持

Bl调用__lookup_machine_type,根据arch number查找。方式类似proc的查找。使用MACHINE_START来把mach info通过lds脚本存放在.arch.info.initmach-smdk2440.c中的内容

Bl调用 __vet_atags查找bootloader传入的tags地址

Bl调用__create_page_tables建立pagetable

返回地址设置为__enable_mmu

执行__arm920_setup

 

 

 

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值