Linux内核的引导

1,当系统上电或复位时,CPU会将PC指针赋值为一个特定的地址0xFFFF0并执行该地址处的指令。在PC机中,该地址位于BIOS中,它保存在主板上的ROM或Flash中

2,BIOS运行时按照CMOS的设置定义的启动设备顺序来搜索处于活动状态并且可以引导的设备。若从硬盘启动,BIOS会将硬盘MBR(主引导记录)中的内容加载到RAM。MBR是一个512字节大小的扇区,位于磁盘上的第一个扇区中(0道0柱面1扇区)。当MBR被加载到RAM中之后,BIOS就会将控制权交给MBR

3,主引导加载程序查找并加载次引导加载程序。它在分区表中查找活动分区,当找到一个活动分区时,扫描分区表中的其他分区,以确保它们都不是活动的。当这个过程验证完成之后,就将 活动分区的引导记录从这个设备中读入RAM中并执行它

4,次引导加载程序加载Linux内核和可选的初始RAM磁盘,将控制权交给Linux内核源代码。

5,运行被加载的内核,并启动用户空间应用程序

另外,第5阶段,它完成启动内核并运行用户空间的 init进程

当内核映像被加载到RAM之后,Bootloader的控制权被释放,内核阶段就开始了。内核映像并不是完全可直接执行的目标代码,而是一个压缩的zImage(小内核)或bzImage(大内核,b表示big)

但是,并非zImage和bzImage映像中的一切都被压缩了,否则Bootloader把控制权交给菏泽哥内核映像它就傻了。实际上,映像中包含未被压缩的部分,这部分中包含解压缩程序,解压缩程序会解压映像中被压缩的部分。zImage和bzImage都是用gzip压缩的,它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解压缩代码

  

当bzImage(用于i386映像)被调用时,它从/arch/i386/boot/head.S的start汇编例程开始执行。这个程序执行一些基本的硬件设置,并调用

/arch/i386/boot/compressed/head.S中的startup_32例程。startup_32程序设置一些基本的运行环境(如堆栈)后,清除BSS段,调用

/arch/i386/boot/compressed/misc.c中的decompress_kernel()C函数解压内核。内核被解压到内存之后,会调用

/arch/i386/kernel/head.S文件中的startup_32例程,这个新的startup_32例程(称为清除程序或进程0)会初始化页表,并启用内存分页机制,接着为任何可选的浮点单元(FPU)检测CPU的类型,并将其存储起来供以后使用。这些都做完之后,/init/main.c中的start_kernel()函数被调用,进入与体系结构无关的Linux内核部分

start_kernel()会调用一系列初始化函数来设置中断,执行进一步的内存配置。之后,/arch/i386/kernel/process.c中kernel_thread()被调度以启动第一个核心线程,该线程执行init()函数,而原执行序列会调用cpu_idle()等待调度

作为核心线程init()函数完成外设及驱动程序的加载和初始化,挂接根文件系统。

init()打开/dev/console设备,重定向stdin、stdout和stderr到控制台。之后,它搜索文件系统中的init程序(也可以由“init=”命令行参数指定init程序),并使用execve()系统调用执行init程序。搜索init程序的顺序为:/sbin/init、/etc/init、/bin/init和/bin/sh。在嵌入式系统中,多数情况下,可以传给内核一个简单的shell脚本来启动必需的嵌入式应用程序

至此,漫长的Linux内核引导和启动过程就此结束,而init()对应的这个由start_kernel()创建的第一个线程也进入用户模式

时间: 2024-10-05 18:45:01

Linux内核的引导的相关文章

linux内核启动引导过程

linux内核(uImage格式镜像,uImage = zImage_压缩的内核镜像 + 0x40字节大小的uboot格式信息头)的启动过程大体可以分为三个阶段: 第一:内核的自解压过程(汇编+C语言实现) 主要由.arch/arm/boot/compressed对zImage完成解压,并调用call_kernel跳转到下阶段代码. 第二:板级引导阶段(汇编实现) 主要进行cpu和体系结构的检查.cpu本身的初始化以及页表的建立等 第三:通用内核启动阶段(C语言实现:重点分析) 1. 进入ini

linux内核结构和启动过程

(以下内容来自教学课件) 一.Linux内核结构 arch 与体系结构相关的代码.对应于每个支持的体系结构,有一个相应的子目录如x86.arm等与之对应,相应目录下有对应的芯片与之对应 drivers 设备驱动代码,占整个内核代码量的一半以上,里面的每个子目录对应一类驱动程序,如:char:字符设备.block:块设备.net:网络设备等 fs 文件系统代码,每个支持的文件系统有相应的子目录,如cramfs,yaffs,jffs2等 include 这里包括编译内核所需的大部分头文件 与平台无关

Linux内核和根文件系统引导加载程序

续博文<u-boot之u-boot-2009.11启动过程分析> Linux内核启动及文件系统载入过程 当u-boot開始运行bootcmd命令.就进入Linux内核启动阶段,与u-boot类似,普通Linux内核的启动过程也能够分为两个阶段,但针对压缩了的内核如uImage就要包含内核自解压过程了.本文以linux-2.6.37版源代码为例分三个阶段来描写叙述内核启动全过程. 第一阶段为内核自解压过程.第二阶段主要工作是设置ARM处理器工作模式.使能MMU.设置一级页表等.而第三阶段则主要为

Linux 内核引导参数简介

概述 内核引导参数大体上可以分为两类:一类与设备无关.另一类与设备有关.与设备有关的引导参数多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导参数.比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导参数,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导参数说明.大多数参数是通过"__setup(... , ...)"函数设置的,少部分是通过"early_param(..

linux 驱动学习笔记03--Linux 内核的引导

如图所示为 X86 PC 上从上电/复位到运行 Linux 用户空间初始进程的流程.在进入与 Linux相关代码之间,会经历如下阶段. ( 1 ) 当系统上电或复位时, CPU 会将 PC 指针赋值为一个特定的地址 0xFFFF0 并执行该地址处的指令.在 PC 机中,该地址位于 BIOS 中,它保存在主板上的 ROM 或 Flash 中. ( 2) BIOS 运行时按照 CMOS 的设置定义的启动设备顺序来搜索处于活动状态并且可以引导的设备. 若从硬盘启动, BIOS 会将硬盘 MBR(主引导

Linux内核编译以及内核引导启动

Linux源码编译的步骤,其实很简单,主要是在配置哪些模块的功能开启方面需要熟悉下,下面来看看,编译Linux内核需要有哪些步骤: 1.需要去Linux官网上去下载一个内核版本的源码, https://www.kernel.org/ 实例使用的是如下版本: linux-2.6.32.65.tar.xz 2.需要解压下载下来的压缩包,解压出来后会出现如下文件夹 xz  linux-2.6.32.65.tar.xz tar xvf linux-2.6.32.65.tar linux-2.6.32.6

U-Boot之LINUX内核引导

基于samsung的Exynos 4412,U-Boot版本为2010.03 前面我们介绍了u-boot的第一阶段和第二阶段,今天我们来介绍u-boot引导内核,这也是u-boot的最后一个阶段,也就是说,这个阶段过后,u-boot的任务就彻底结束了,Linux内核将接管一切软硬件资源.下面开始我们的分析. u-boot引导内核分为两个阶段 将内核镜像从FLASH加载到内存 启动内核 将内核镜像从FLASH加载到内存,这个目标一般是通过一个叫做do_xxx的函数实现的,xxx是存储介质的名称,比

Linux内核编译 Ubuntu 14.04.3 server 升级至3.19.8

读书笔记:<Linux内核设计与实现>,原书第3版,陈莉君 康华 译 第2章:从内核出发     2.3节:编译内核 实验: ============================================================ 系统环境:VM虚拟机 Ubuntu 14.04.3 LTS server版 任务:编译安装新的内核 注意:不要跨大版本,我在3.19版本内 耗时:2小时 所有版本的内核: https://www.kernel.org/pub/linux/kernel

如何切入 Linux 内核源代码

Makefile不是Make Love 从前在学校,混了四年,没有学到任何东西,每天就是逃课,上网,玩游戏,睡觉.毕业的时候,人家跟我说Makefile我完全不知,但是一说Make Love我就来劲了,现在想来依然觉得丢人. 毫不夸张地说,Kconfig和Makefile是我们浏览内核代码时最为依仗的两个文件.基本上,Linux内核中每一个目录下边都会有一个 Kconfig文件和一个Makefile文件.对于一个希望能够在Linux内核的汪洋代码里看到一丝曙光的人来说,将它们放在怎么重要的地位都