- OK6410 修改的 linux-3.0.1 的代码启动流程
smdk6410 MACH_SMDK6410 SMDK6410 1626
涉及到的文件
arch/arm/kernel/head.S
arch/arm/kernel/head-common.S
arch/arm/kernel/asm-offsets.c
arch/arm/mm/proc-v6.S
匹配处理器
校验tags
建立临时页表
开MMU
数据段搬运 bss段清0 设置sp
相关变量赋值
跳转到 start_kernel
1.
设置处理器到 svc 运行模式,关 FIQ 与 IRQ
2.
从 cp15 处理器的 寄存器 0 中 读取 id code , 得到 处理器 id
将处理器id 与 __proc_info_begin 到 __proc_info_end 中的 proc_info 结构体 比较,得出一个 匹配的 proc_info_list 结构体
3.
算出 PAGE_OFFSET(0xC0000000) 逻辑地址 对应的 运行地址(50000000 - C0008000 + C0000000 = 50000000),并存储到r8.
为 页表基址 提供参考值
4.
针对 r2, 确定 第一个 tag 是 ATAG_CORE
5.
创建临时页表
1. 4K个一级页表项,用来索引二级页表(用来索引1MB),索引4G内存
2. 为 从__enable_mmu到__enable_mmu_end 的代码 创建 直接映射
3. 为 kernel 建立从虚拟地址到物理地址的映射
4. 为 r2 中的 bootargs 建立从虚拟地址到物理地址的映射,包括了过程1中创建的16K一级页表
6.
开启 MMU
1. __v6_setup,为开启MMU做准备
2. __enable_mmu->__turn_mmu_on
7.
__mmap_switched
1. 搬运数据段
2. 清空bss段
3. 赋值变量
arch/arm/kernel/setup.c 中的 unsigned int processor_id
arch/arm/boot/compressed/misc.c 中的 unsigned int __machine_arch_type
arch/arm/kernel/setup.c 中的 unsigned int __atags_pointer __initdata
arch/arm/kernel/entry-armv.S 中的 cr_alignment
arch/arm/kernel/entry-armv.S 中的 cr_no_alignment
4. 设置sp
sp = init_thread_union + 8184
8.
b start_kernel
跳转到 start_kernel
链接:https://pan.baidu.com/s/1l_ZOSBy-kAD3MhrsZaMrZQ
提取码:anox
复制这段内容后打开百度网盘手机App,操作更方便哦
- 下一步, 确定 start_kernel 之前, 所有内存相关符号的意义及内存分布
KERNEL_RAM_VADDR
CONFIG_PAGE_OFFSET
PAGE_OFFSET
PHYS_OFFSET
TEXT_OFFSET
KERNEL_START
KERNEL_END