linux内存管理 (三) 3 未压缩内核启动流程-从stext到start_kernel

  • 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
  • 大致过程
1.
设置处理器到 svc 运行模式,关 FIQ 与 IRQ
2.
从 cp15 处理器的 寄存器 0 中 读取 id code , 得到 处理器 id
将处理器id 与 __proc_info_begin 到 __proc_info_end 中的 proc_info 结构体 比较,得出一个 匹配的 proc_info_list 结构体
	// 否则 死循环
3.
算出 PHYS_OFFSET
4.
针对 r2, 确定 第一个 tag 是 ATAG_CORE
	// 否则, 赋值 r2 为 0
5.
创建临时页表 // 参考 https://blog.csdn.net/clb1609158506/article/details/41447475 中的图
	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

你可能感兴趣的:(Linux内存管理)