内核启动过程分析(自解压后到start_kernel).doc

内核启动过程分析(自解压后到start_kernel).doc

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
内核启动过程分析(自解压后到start_kernel)

内核启动过程分析 在学习过程中“行走的流云”的博文给了我很大的帮助,我也复制了很多他的总结,在这里感谢他! 本文件的代码主要是讲内核开始工作前的准备工作,其工作主要有一下几点: 进入管理模式,判断处理器ID是否匹配,判断机器ID是否匹配,判断atags指针是否合法。 建立页表,实现虚拟地址和物理地址的映射。 关闭Icache、Dcache、清空write buffer、使TLB无效 使能MMU、使能cache跳转到start kernel开始真正的内核运行。 对于经过压缩的内核(zImage),先运行解压缩decompress_kernel,然后还需要重定位,然后调用内核,就象跳到未压缩的内核中的开始处,内核的startup在arch/arm/kernel/head.S中,进行页表初始化和处理器缓存初始化等工作,然后跳到C代码init/main.c中的start_kernel,接下来的事情就是大众化工作了,在这里,我们继续分析解压缩后的工作,即是arch/arm/kernel/head.S的工作内容。 首先先说下内核的启动条件: 1. CPU必须处于SVC(supervisor)模式,并且IRQ和FIQ中断都是禁止的; 2. MMU(内存管理单元)必须是关闭的, 此时虚拟地址对物理地址; 3. 数据cache(Data cache)必须是关闭的 4. 指令cache(Instruction cache)可以是打开的,也可以是关闭的,这个没有强制要求; 5. CPU 通用寄存器0 (r0)必须是 0; 6. CPU 通用寄存器1 (r1)必须是 ARM Linux machine type? 7. CPU 通用寄存器2 (r2) 必须是 kernel parameter list 的物理地址/* * linux/arch/arm/kernel/head.S * * Copyright (C) 1994-2002 Russell King * Copyright (c) 2003 ARM Limited * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Kernel startup code for all 32-bit CPUs */ #include linux/linkage.h #include linux/init.h #include asm/assembler.h #include asm/domain.h #include asm/ptrace.h #include asm/asm-offsets.h #include asm/memory.h #include asm/thread_info.h #include asm/system.h #if (PHYS_OFFSET 0x001fffff) #error PHYS_OFFSET must be at an even 2MiB boundary!//boundary(分界线) #endif #define KERNEL_RAM_VADDR (PAGE_OFFSET + TEXT_OFFSET) #define KERNEL_RAM_PADDR (PHYS_OFFSET + TEXT_OFFSET) /* * swapper_pg_dir is the virtual address of the initial page * We place the page tables 16K below KERNEL_RAM_VADDR. Therefore, we must * make sure that KERNEL_RAM_VADDR is correctly set. Currently, we expect * the least significant 16 bits to be 0x8000, but we could probably * relax this restriction to KERNEL_RAM_VADDR = PAGE_OFFSET + 0x4000. */ swapper_pg_dir 是初始页表的虚拟地址.我们将页表放在KERNEL_RAM_VADDR以下16K的空间中. 因此我们必须保证KERNEL_RAM_

文档评论(0)

wyjy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档