ARM Linux启动过程学习
o文件。
使用kernel目录下的vmlinux.lds link脚本生成vmlinux elf格式的可执行文件
Vmlinux使用arm-linux-objcopy生成bin格式的文件image。仅仅包含指令和数据。
可以load到sdram的0x30008000地址运行。为什么非要load到这个地址呢?通过跟踪
Head.S执行,发现在__lookup_machine_type函数中,如果load地址不是0x30008000,
Ldmia r3, {r4, r5, r6}会出现错误,r4的内容出现错误
为了分析linux启动过程,生成一个最小的kernel,然后使用AXD+JTAG来进行单步跟踪
生成一个tiny kernel使用axd跟踪500+K的bin文件,load到0x30008000地址进行跟踪
首先执行的代码为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
从协处理器中得到CPU的ID
Bl指令调用__lookup_processor_type函数查找proc info lds link脚本根据autoconf.h中配置的CPU类型,把proc-arm920.S文件中的信息存放到__proc_info_begin和__proc_info_end之间,根据CPU的ID查找CPU类型是否支持
Bl调用__lookup_machine_type,根据arch number查找。方式类似proc的查找。使用MACHINE_START来把mach info通过lds脚本存放在.arch.info.init。mach-smdk2440.c中的内容
Bl调用__vet_atags查找bootloader传入的tags地址
Bl调用__create_page_tables建立pagetable
返回地址设置为__enable_mmu
执行__arm920_setup
ARMLinux启动过 相关文章:
- ARM Linux 的启动过程(11-09)
- arm linux 启动过程(11-09)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)