`
bigfirebird
  • 浏览: 129521 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

linux2.6.29 启动过程详细分析

阅读更多
突然心血来潮,想自己写个模块,于是就把linux2.6.29的启动过程有分析了一下,整理出来和大家分享下。
linux的启动大体上可以分几个步骤:
第一部分 grub部分,内核的加载过程。
这里总结一下别人的思想,因为自己没怎么看过grub的源码。
1. Bios执行int 0x19,加载MBR至0x7c00并跳转执行,这个MBR在我们通常的系统中就是stage1.S(512B), 位于磁盘的0面0道第一扇区,程序跳到0x7c00处执行
2. stage1执行过程中会加载磁盘0面0道第二扇区的512B的一段程序至0x8000处,就是grub源码里stage2/start.S,这里start.S是stage1_5或是stage2的总入口,它才是stage1_5或者stage2的真正加载器。
3. 在stage1_5加载之前,stage2是不可能被加载的,因为stage1并不能识别文件系统
stage1_5究竟被放在哪呢?很多兄弟可能以为它就是/boot/grub/底下的哪些xxfs_stage1_5文件,但试想一下,要找到boot 分区所在的stage1_5文件,那么就必须使得stage1具备文件系统识别功能,而stage1_5本身就是文件系统的支撑代码,它必须加载 stage1_5才能具备这种功能。那么,我们又回到了那种矛盾体的悖论──要加载stage1_5来找到stage1_5? 呵呵。

所以用来识别boot分区文件系统的stage1_5不能作为文件来被stage1读取, 它只能被存放在固定的扇区中。这里强调"用来识别boot分区文件系统",那是因为并不是所有的stage1_5文件都被放在固定扇区的,只有boot分 区的文件系统对应的stage1_5才会被放在固定的扇区中去!比如说,你的boot分区的文件系统是ext2,那么在安装GRUB的stage1的时 候,e2fs_stage1_5就会被存放至一个固定的扇区集,而其他的如reiserfs_stage1_5就依然作为文件来存放,以供GRUB使用 root()命令来识别其他的boot分区(那时候,stage2已经被加载了,所以这个不成问题)
最后得出结论,stage1.S被放在0面0道的第1扇区,start.S被放在0面0道的第2扇区,而与boot分区相关的文件系统的xxfs_stage1_5被放在0面0道第3扇区开始的扇区里,其占据的扇区数目与该stage1_5文件的大小有关。而其余的stage1_5以及stage2都作为文件被存放在boot分区里。

上面是摘自一位网友的,但是看grub后面的版本比如0.97,好像就不存在所谓的stage1_5了??这是个疑问。
4. 讲完了stage1以及stage1_5的执行流程以及位置关系后,就轮到stage2这个大约110KB左右的mini OS了。stage2的入口是stage2/asm.S,asm.S在设置好c运行环境之后,会调用第一个c函数init_bios_info(stage2/common.c),这个函数在执行一些底层的初始 化之后,会调用stage2的main函数cmain(stage2/stage2.c),这样stage2这个 mini os正式开始运行了!

针对menu.lst和shell这两种情况,cmain将:
menu.lst: run_menu()(stage2.c)->run_script()(cmdline.c)->find_command->执行命令函数
shell: enter_cmdline()(cmdline.c)->find_command->执行命令函数

殊途同归,最后都归结为命令行的解释执行
find_command(stage2/cmdline.c)按照menu.lst中或者shell用户输入的命令字符串,在一个全局性struct builtin *builtin_table[](stage2/builtin.c)变量中去找到内置命令的函数,然后执行。

值得一提的是grub的shell类似bash的命令补全和命令历史纪录。

这里需要注意的是:stage2要现进入保护模式,把操作系统内核加载到内存,然后回到保护模式,把控制权交给内核。

第二部分 linux内核的启动
1. 内核会从header.S开始执行,具体为什么会从这里运行,在以后看完grub源码后会详细解释
分享到:
评论

相关推荐

    linux2.6.29

    以下是对Linux 2.6.29内核主要知识点的详细说明: 1. **增强的文件系统支持**:Linux 2.6.29 引入了对多种文件系统的改进和增强,如EXT4的预分配功能,这有助于减少磁盘碎片并提高文件系统的寿命。同时,对Btrfs...

    linux2.6.29的qq2440补丁文件

    linux2.6.29的qq2440补丁文件

    linux2.6.29源码

    下面将详细介绍Linux内核源码中的关键组件和概念。 一、内核架构 Linux内核主要分为几个关键部分:进程管理、内存管理、设备驱动、文件系统、网络协议栈等。在2.6.29版本中,这些部分都有相应的改进和优化。 1. ...

    linux2.6.29 driver

    Linux 2.6.29 驱动程序是针对这个特定内核版本的设备驱动集合,它包含了一系列用于与硬件交互的代码,确保操作系统能够识别并充分利用各种硬件资源。在Linux内核的发展历程中,每个版本都有所不同,2.6.29是一个较早...

    arm_linux内核启动过程分析

    本篇文章将以Samsung公司的S3C2410芯片为背景,基于mini2440平台和Linux 2.6.29版本,深入探讨Linux内核的启动过程。 #### 二、启动过程详解 ##### 1. zImage自解压 Linux内核通常会被压缩成zImage格式以便于存储...

    linux-2.6.29.tar.gz

    《Linux 2.6.29 内核详解与系统移植》 Linux 2.6.29 是 Linux 内核历史上的一个重要版本,它在2009年发布,为当时的开发者和嵌入式系统设计者提供了丰富的功能和改进。这个版本的内核对于学习 Linux 内核原理和进行...

    基于linux-2.6.29在mini2440上移植boa服务器的详细步骤

    本文档详细介绍了如何在基于 Linux 2.6.29 的 Mini2440 开发板上移植 Boa 服务器的过程。Boa 是一款轻量级的 Web 服务器,非常适合用于嵌入式系统。通过本指南,您可以了解到完整的移植流程,包括下载源代码、必要的...

    运动图像检测系统 mini2440 linux2.6.29 motion

    - **Bootloader**: 使用的是U-boot 2008.10版本,负责系统的启动加载过程。 - **Linux内核**: 版本为2.6.29,用于提供底层硬件驱动和支持上层应用程序的运行环境。 - **NFS Root File System**: 通过网络文件系统...

    Linux2.6.29内核映像文件For友善之臂mini2440

    为友善之臂mini2440编译好的内核映像文件zImage,内核版本号2.6.29,交叉编译工具arm-linux-gcc-3.4.5

    linux-2.6.29.tar.bz2

    linux-2.6.29.tar.bz2

    linux-2.6.29在mini2440上的内存底层初始化学习笔记

    Linux-2.6.29在Mini2440上的内存底层初始化是一个复杂的过程,涉及到内存控制器的初始化、bitmaps的建立、buddy系统的配置等多个方面。这些初始化过程确保了内存资源的有效管理,提高了系统的整体性能。对于开发者来...

    rt73-2.6.29-linux-driver

    标题“rt73-2.6.29-linux-driver”涉及的是一个专为Linux操作系统设计的无线网卡驱动程序,适用于Linux内核版本2.6.29。这个驱动是针对RT73系列芯片的,它由Ralink Technology公司生产,主要用于802.11g/b无线网络...

    Linux2.6.9源代码

    Linux 2.6.29 源代码是 Linux 内核发展历史中的一个重要版本,它包含了大量的更新、改进和新特性。对于任何对操作系统内核感兴趣的开发者或研究者来说,深入理解这部分源代码都是一个宝贵的资源。在这个版本中,我们...

    goldfish-android-goldfish-2.6.29

    "goldfish-android-goldfish-2.6.29" 是一个特定版本的Android模拟器内核源代码包,基于Linux内核2.6.29。这个版本的Goldfish内核是Android开发环境中用于模拟Android设备硬件的一个关键组件。在Android应用开发和...

    linux驱动头文件位置及作用

    本篇文章将详细介绍Linux驱动开发中常用的头文件的位置及其作用,并通过示例代码帮助读者更好地理解每个头文件的作用。 #### 二、Linux驱动头文件概览 Linux驱动程序开发涉及多种头文件,它们分布在不同的目录下。...

    Linux中常见头文件的包含位置

    本文将详细介绍 Linux 中常见头文件的包含位置,并对其进行详细的解释。 1. GPIO 头文件 在 mini2440 平台上,GPIO 头文件的定义位于 Linux-2.6.29/arch/arm/plat-s3cxx 目录下的 gpio.c 文件中,声明位于 Linux-...

    简单、规范的Linux下的ds18b20驱动(基于mini2440开发板,2.6.29内核)

    在本教程中,我们将探讨如何在基于Mini2440开发板且搭载2.6.29内核的Linux环境下编写DS18B20驱动程序。尽管Linux内核已经内置了1-Wire驱动,但为了学习和实践,我们可以创建一个简单的自定义驱动。 1. **1-Wire协议...

    国嵌全部必修实验手册(第11部分_linux内核).pdf

    1. **配置与编译Linux 2.6.29内核**:熟悉内核配置选项,理解编译过程,为后续的系统定制打下基础。 2. **在VMware中安装编译好的内核**:实际操作虚拟环境下的内核安装,体验新内核带来的系统变化。 #### 实验准备...

    micro2440之Linux驱动程序

    本文旨在详细介绍Micro2440开发板上运行的Linux系统中各驱动程序的位置及其对应的设备名,为开发者提供全面的参考信息。 #### 二、YAFFS2 文件系统 **位置**: `Linux-2.6.29/fs/yaffs2` **设备名**: 开发板根文件...

    Linux预取算法分析与研究.pdf

    《Linux预取算法分析与研究》这篇论文详细探讨了Linux操作系统中的预取技术,这是为了提升系统性能,尤其是服务器性能的重要策略。预取技术通过预测并预先加载应用程序即将需要的数据到缓存中,以减少I/O等待时间,...

Global site tag (gtag.js) - Google Analytics