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

内核启动过程分析

在学习过程中“行走的流云”的博文给了我很大的帮助,我也复制了很多他的总结,在这里感谢他!

本文件的代码主要是讲内核开始工作前的准备工作,其工作主要有一下几点:

1. 进入管理模式,判断处理器ID是否匹配,判断机器ID是否匹配,判断atags指针是

否合法。

2. 建立页表,实现虚拟地址和物理地址的映射。

3. 关闭Icache、Dcache、清空write buffer、使TLB无效

4. 使能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>

你可能喜欢

  • linux内核启动分析
  • Linux内核分析
  • Linux内核配置
  • 嵌入式Linux
  • 代码管理
  • 内存管理

内核启动过程分析(自解压后到start_kernel)相关文档

最新文档

返回顶部