- 浏览: 129521 次
- 性别:
- 来自: 北京
-
最新评论
-
yangtaoxf126.com:
public class SimpleJDBC {
publ ...
oracle的sys用户怎么通过jdbc连接
突然心血来潮,想自己写个模块,于是就把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源码后会详细解释
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源码后会详细解释
发表评论
-
__define_initcall 作用
2010-11-25 19:26 1270前言 宏定义__define_initcall ... -
转载--Linux 2.6内核I/O端口资源管理
2010-11-02 15:39 863申明:本文章是对“Linux对I/O端口资源的管理”该文章进行 ... -
linux 2.6线程创建源码分析
2010-11-02 15:09 1139上章讲到线程,现在对线程创建的代码流程分析下。来一步一步揭开她 ... -
linux 2.6进程与线程
2010-11-02 15:09 12491 > 线程和进程的 ... -
linux中ELF加载过程分析
2010-10-19 11:16 1968linux中ELF加载过程分析 - 博青港湾-技术空间 - ... -
Linux设备模型 学习总结
2010-10-13 21:21 963看LDD3中设备模型一章,觉得思维有些混乱。这里从整体的角度来 ... -
linux软中断的实现
2010-10-13 21:12 1132中断服务程序往往都是在CPU关中断的条件下执行的,以避免中断 ... -
zImage / vmlinux / Image生成的流程图
2010-10-13 21:11 2457SRC_TREE :=./ HEADER_PATH ... -
执行程序时内存管理的情景
2010-10-13 21:07 1479do_execve ->open_exec->de ... -
Linux Kernel 2.6进程调度的分析(揭示了几乎所有2.6调度的东西)
2010-10-13 20:16 1926第一章 Kernel 2.4存在的 ... -
ibm developer blog
2010-10-10 10:05 891Linux slab 分配器剖析 http://www.ibm ... -
Linux内存:内存管理的实质
2010-08-04 21:22 723<转 http://linux.chinaunix. ... -
container_of 解析
2010-07-29 22:50 997在学习Linux驱动的过程中,遇到一个宏叫做container ... -
高级IO操作——ioctl
2010-07-23 20:48 1475_IO, _IOR, _IOW, _IOWR 宏的用法与解析 ... -
主设备号、次设备号
2010-07-23 16:13 942主设备号、次设备号分 ... -
Linux在控制台下不同类型文件显示不同颜色
2010-07-20 23:47 2597# ~/.bashrc: executed by bash(1 ... -
linux 编译内核 选项出错 综合
2010-07-20 23:24 1032具体错误提示见最后面 ... -
ARM SDT下汇编到GNU汇编的转换
2010-07-16 08:52 908将ARM SDT下的汇编码移植到GCC for ARM编译器时 ... -
GNU ARM 汇编指令(转)
2010-07-16 08:50 1684第一部分 Linux下ARM汇编语法尽管在Linux下使用C或 ... -
arm 嵌入式LINUX启动过程
2010-07-11 00:44 3929一位大师级的人物写的,不看要后悔的哟!! ...
相关推荐
以下是对Linux 2.6.29内核主要知识点的详细说明: 1. **增强的文件系统支持**:Linux 2.6.29 引入了对多种文件系统的改进和增强,如EXT4的预分配功能,这有助于减少磁盘碎片并提高文件系统的寿命。同时,对Btrfs...
linux2.6.29的qq2440补丁文件
下面将详细介绍Linux内核源码中的关键组件和概念。 一、内核架构 Linux内核主要分为几个关键部分:进程管理、内存管理、设备驱动、文件系统、网络协议栈等。在2.6.29版本中,这些部分都有相应的改进和优化。 1. ...
Linux 2.6.29 驱动程序是针对这个特定内核版本的设备驱动集合,它包含了一系列用于与硬件交互的代码,确保操作系统能够识别并充分利用各种硬件资源。在Linux内核的发展历程中,每个版本都有所不同,2.6.29是一个较早...
本篇文章将以Samsung公司的S3C2410芯片为背景,基于mini2440平台和Linux 2.6.29版本,深入探讨Linux内核的启动过程。 #### 二、启动过程详解 ##### 1. zImage自解压 Linux内核通常会被压缩成zImage格式以便于存储...
《Linux 2.6.29 内核详解与系统移植》 Linux 2.6.29 是 Linux 内核历史上的一个重要版本,它在2009年发布,为当时的开发者和嵌入式系统设计者提供了丰富的功能和改进。这个版本的内核对于学习 Linux 内核原理和进行...
本文档详细介绍了如何在基于 Linux 2.6.29 的 Mini2440 开发板上移植 Boa 服务器的过程。Boa 是一款轻量级的 Web 服务器,非常适合用于嵌入式系统。通过本指南,您可以了解到完整的移植流程,包括下载源代码、必要的...
- **Bootloader**: 使用的是U-boot 2008.10版本,负责系统的启动加载过程。 - **Linux内核**: 版本为2.6.29,用于提供底层硬件驱动和支持上层应用程序的运行环境。 - **NFS Root File System**: 通过网络文件系统...
为友善之臂mini2440编译好的内核映像文件zImage,内核版本号2.6.29,交叉编译工具arm-linux-gcc-3.4.5
linux-2.6.29.tar.bz2
Linux-2.6.29在Mini2440上的内存底层初始化是一个复杂的过程,涉及到内存控制器的初始化、bitmaps的建立、buddy系统的配置等多个方面。这些初始化过程确保了内存资源的有效管理,提高了系统的整体性能。对于开发者来...
标题“rt73-2.6.29-linux-driver”涉及的是一个专为Linux操作系统设计的无线网卡驱动程序,适用于Linux内核版本2.6.29。这个驱动是针对RT73系列芯片的,它由Ralink Technology公司生产,主要用于802.11g/b无线网络...
Linux 2.6.29 源代码是 Linux 内核发展历史中的一个重要版本,它包含了大量的更新、改进和新特性。对于任何对操作系统内核感兴趣的开发者或研究者来说,深入理解这部分源代码都是一个宝贵的资源。在这个版本中,我们...
"goldfish-android-goldfish-2.6.29" 是一个特定版本的Android模拟器内核源代码包,基于Linux内核2.6.29。这个版本的Goldfish内核是Android开发环境中用于模拟Android设备硬件的一个关键组件。在Android应用开发和...
本篇文章将详细介绍Linux驱动开发中常用的头文件的位置及其作用,并通过示例代码帮助读者更好地理解每个头文件的作用。 #### 二、Linux驱动头文件概览 Linux驱动程序开发涉及多种头文件,它们分布在不同的目录下。...
本文将详细介绍 Linux 中常见头文件的包含位置,并对其进行详细的解释。 1. GPIO 头文件 在 mini2440 平台上,GPIO 头文件的定义位于 Linux-2.6.29/arch/arm/plat-s3cxx 目录下的 gpio.c 文件中,声明位于 Linux-...
在本教程中,我们将探讨如何在基于Mini2440开发板且搭载2.6.29内核的Linux环境下编写DS18B20驱动程序。尽管Linux内核已经内置了1-Wire驱动,但为了学习和实践,我们可以创建一个简单的自定义驱动。 1. **1-Wire协议...
1. **配置与编译Linux 2.6.29内核**:熟悉内核配置选项,理解编译过程,为后续的系统定制打下基础。 2. **在VMware中安装编译好的内核**:实际操作虚拟环境下的内核安装,体验新内核带来的系统变化。 #### 实验准备...
本文旨在详细介绍Micro2440开发板上运行的Linux系统中各驱动程序的位置及其对应的设备名,为开发者提供全面的参考信息。 #### 二、YAFFS2 文件系统 **位置**: `Linux-2.6.29/fs/yaffs2` **设备名**: 开发板根文件...
《Linux预取算法分析与研究》这篇论文详细探讨了Linux操作系统中的预取技术,这是为了提升系统性能,尤其是服务器性能的重要策略。预取技术通过预测并预先加载应用程序即将需要的数据到缓存中,以减少I/O等待时间,...