内核的启动过程

1:总的来说内核的启动过程可以分为三个阶段:

第一阶段:内核的搬移,将启动介质中的静态内核搬移到DDR中相应的位置中去;

第二阶段:镜像文件头信息的校验,目的是确定烧录的是哪种image格式的镜像;

第三个阶段:启动内核,调用do_bootm_linux函数来完成的,最终是通过调用thekernel函数来往内核中传参,并启动内核

具体表现为:通过movi read kernel 0x30008000命令将内核搬移到DDR中,对应地址为0x30008000,然后使用bootm 0x30008000命令去启动内核。

2:具体步骤分析

第一阶段:搬移内核

(1)一开始DDR中并没有内核代码,内核代码在我们的启动介质的(我这里用的是SD卡)raw分区中,纯粹的linux在SD卡中有三个分区:uboot kernel rootfs,而kernel分区这个区域范围就是被设计用来存放内核镜像的

(2)在uboot中,uboot自身可以通过重定位(uboot启动的第一阶段)将uboot代码搬移到DDR中,而kernel中并没有设计重定位代码,所以kernel需要uboot将其从启动介质中搬移到DDR中。

(3)为什么是0x30008000这个地址处?

内核一定要放在链接地址处,链接地址在内核代码的链接脚本或者Makefile中可以找到。x210中是0x30008000

第二阶段:内核头信息校验

(1)linux内核经过编译之后会生成一个elf的可执行程序叫做vmlinux或vmlinuz(78M),使用objcopy工具制作课生成镜像格式的文件image(7.5M)(可烧录,uboot.bin一样,只是没有后缀.bin)。但是linux作者们还是image这个镜像太大了,所以进行了进一步压缩,并在镜像的头部添加了解压代码(解压代码未压缩),变成个一个自解压的镜像文件,叫做zImage

(2)uboot为了启动内核专门发明了一种uImage格式,uImage是由zImage加工得到的。(其实就是在zImage的头部添加64字节的头信息)

需要注意的是uImage和linux内核无关,内核只负责生成zImage,然后使用uboot工具mkimage将zImage加工生成uImage来给uboot启动。

由上面额分析可知,现在可以使用的镜像格式有两种分别是zImage和uImage,原则上uboot启动时应该使用uImage格式的内核镜像,但实际上uboot也可以支持zImage格式的内核镜像,这就取决于x210_sd.h中是否定义了CONFIG_ZIMAGE_BOOT这个宏,所以有些uboot只支持uImage启动,有些uboot支持uImage和zImage启动

(3)头信息的校验

uboot启动命令是bootm对应的函数是do_bootm,(这个函数在/common/Cmd_boot.c)这个函数中一直到397行的after_header_check这个符号处,都是在进行镜像的头部信息校验。校验时要根据不同类型的image类型进行不同的校验。如果校验通过,则去启动内核;如果校验失败,则不能启动。

(1)#ifdef CONFIG_ZIMAGE_BOOT来控制条件编译一段代码,这段代码是用来支持zImage格式的内核启动。

(2)#define LINUX_ZIMAGE_MAGIC    0x016f2818 :这个是一个定义的魔数,这个数等于0x016f2818,表示这个镜像是一个zImage。也就是说zImage格式的镜像中在头部的一个固定位置放了一个数作为格式标记。如果我们拿到一个image,去他的那个位置去取4字节判断它是否等于LINUX_ZIMAGE_MAGIC,则可以知道这个镜像是不是一个zImage。

时间: 2024-11-08 17:54:26

内核的启动过程的相关文章

Linux内核分析 实验三:跟踪分析Linux内核的启动过程

贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 1.打开shell,输入启动指令,内核启动完成后进入menu程序,支持三个命令help.version和quit. 2.然后使用gdb跟踪调试内核,输入命令qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S 3.按住

(作业3)Linux内核的启动过程(从start_kernel到init进程启动)

作业题目: 详细分析从start_kernel到init进程启动的过程并结合实验截图撰写一篇署名博客,并在博客文章中注明“真实姓名(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”,博客内容的具体要求如下: 题目自拟,内容围绕Linux内核的启动过程,即从start_kernel到init进程启动: 博客中需要使用实验截图 博客内容中需要仔细分析

Linux内核分析之跟踪分析Linux内核的启动过程

一.实验过程 使用实验楼虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 内核启动进入 menu 程序.下面是用 gbd 来跟踪内核的启动过程: gdb (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表 (gdb)target remote:1234 # 建立gdb和gdbserver之间的

20135239 益西拉姆 linux内核分析 跟踪分析Linux内核的启动过程

回顾 1.中断上下文的切换——保存现场&恢复现场 本节主要课程内容 Linux内核源代码简介 1.打开内核源代码页面 arch/目录:支持不同CPU的源代码:其中的X86是重点 init/目录:内核启动相关的代码基本都在该目录中(比如main.c等) start_kernel函数就相当于普通C程序的main函数 kernel/目录:Linux内核核心代码在kernel目录中 README 介绍了什么是Linux,Linux能够在哪些硬件上运行,如何安装内核源代码等 构造一个简单的linux系统m

跟踪调试Linux内核的启动过程

跟踪调试Linux内核的启动过程---使用gdb 符钰婧 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 本次的实验是使用gdb跟踪调试内核从start_kernel到init进程启动,并分析启动的过程. 1.首先是在实验楼虚拟机上进行调试跟踪的过程. (1) 先构造一个简单的Linux系统 (2) 接下来使用gdb跟踪调试内核 启动(窗口被冻结) 另开一个shell窗口(水平分割)

跟踪分析Linux内核的启动过程--实验报告 分析 及知识重点

跟踪分析Linux内核的启动过程 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ) 知识总结: ****Linux内核中关键目录: arch:不同cpu的支持,我们主要关注的是其中x86文件夹 init:内核启动的相关代码,期中main.c是内核启动的起点,main.c中的start_kernel是内核初始化的起点 ker

实验三:跟踪分析Linux内核的启动过程 ----- 20135108 李泽源

实验要求: 使用gdb跟踪调试内核从start_kernel到init进程启动 详细分析从start_kernel到init进程启动的过程并结合实验截图撰写一篇署名博客,并在博客文章中注明“真实姓名(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”,博客内容的具体要求如下: 题目自拟,内容围绕Linux内核的启动过程,即从start_kernel

Linux内核的启动过程简述

陈铁 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 其实对于Linux算是很熟悉了,最近五年的工作电脑就安装的Ubuntu系统,由于毕竟工作时Windows还离不开,于是就在主机下虚拟个windows XP系统,解决必须用windows的工作.尽管这样,对于内核的启动过程其实一无所知,只是看到启动过程不断输出信息,然后等待shell的登陆界面.这次通过学习,也算略有了解,就把老

跟踪分析Linux内核的启动过程

李亚健    <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验过程: 实验内容为使用gdb跟踪调试内核从start_kernel到init进程启动 1.根据实验指导按照过程,在实验楼环境下打开shell: cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 输入help指令: 2.使用gdb