突然心血来潮,想自己写个模块,于是就把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源码后会详细解释
相关推荐
MySQL 5.6.29 Linux安装及配置实战
MySQL 5.6.29作为开源数据库的佼佼者,其更新带来了诸多改进和新特性。这个版本特别专注于性能和可扩展性的优化,对于中大型企业应用,提供了更加稳定的数据库解决方案。它引入了对InnoDB引擎的增强、改进了复制功能,并提高了对云计算平台的支持。Linux_glibc2.5.x86_64架构是基于x86_64指令集的Linux操作系统环境下的一个版本,该架构采用了glibc2.5版本的C库。
Linux2.6.38内核启动流程分析
Linux 启动的第一阶段 Uboot最后带着三个参数跳转到内核入口这三个参数分别是: r0 = 0, r1 = machine type number discovered in (3) above. r2 = physical address of tagged list in system RAM. Linux运行的第一个文件是 arch/arm/boot/compress
Linux环境下MySQL 5.6.29源码编译安装指南
在Linux系统中安装MySQL数据库是开发和运维工作中的基础技能。本章将介绍Linux下安装MySQL的两种流行方法:使用官方提供的安装包和源码编译安装。
Linux-2.6.22.6启动分析之一:make s3c2410_defconfig
草稿
linux 2.6.22启动过程分析
这是我自己参照网上的资料针对2.6.22的内核启动过程所做的大概分析,有很多不足之处,请多多指教
linux 2.6 启动流程分析
linux 2.6 启动流程分析 linux 2.6 启动流程分析
基于PXAxxx平台的Andriod(Linux kernel 2.6.29)内核移植到Meego(linux kernel 2.6.35)过程一
<br />学习嵌入式ARM linux,主要想必三个方向发展:<br />1、嵌入式linux应用软件开发<br />2、linux内核的剪裁和移植<br />3、嵌入式linux底层驱动的开发<br /><br /> 主 要介绍内核移植过程中涉及文件的分布及其用途,以及简单介绍系统的初始化过程。整个arm linux内核的启动可分为三个阶段:<br />第一阶段主要是进行 cpu和体系结构的检查、cpu本身的初始化以及页表的建立等;<br />第二阶段主要是对系统中的一些基础设施进行初始化;<br
告别编译失败:详解Keil MDK中ARM编译器V5与V6的区别及项目迁移选择
本文深入解析Keil MDK中ARM编译器V5与V6的核心差异,提供STM32项目迁移的完整指南。从代码生成策略、优化重点到语法支持,详细对比两版本特性,并给出项目兼容性评估框架和双版本共存配置方案,帮助开发者高效解决编译器版本冲突问题。
2.6.29内核移植到mini2440
2.6.29内核移植到mini2440 (转)LInux环境搭建与设置 2009-06-12 18:10:10 阅读899 评论5字号:大中小 软件平台:vm(fodera 9)+arm-linux-gcc 4.3.2 最近老师要求我使用mini2440自带的AD来采集数据,师命不可违,于是开工了。以前在mini2440上一直使用的
什么是以太网链路聚合
以太网链路聚合技术通过将多个物理端口捆绑成逻辑端口,可显著提升网络性能。该技术能增加总带宽(各链路带宽之和)、提高可靠性(故障秒级切换)并实现智能负载分担。主要分为手工模式和基于LACP协议的动态模式,后者能检测链路故障更可靠。配置时需确保接口参数一致、模式匹配,适用于核心交换、服务器接入等场景。华为设备通过创建Eth-Trunk接口、指定LACP模式并添加成员接口即可完成部署。这项成熟技术能以低成本解决带宽瓶颈和可靠性问题,是构建高速稳定网络的关键方案。
FEDORA10 编译 linux-2.6.31
转贴 验证通过Fedora10下编译内核 2009年5月10日 LinuxHobby 发表评论 阅读评论 环境:fedora10,内核包:linux-2.6.29.3.tar.bz2 (F)完整的内核包。1、将linux-2.6.29.3.tar.bz2复制到/
基于MATLAB/Simulink与WSL2的ROS2实时联合仿真实践
本文详细介绍了基于MATLAB/Simulink与WSL2的ROS2实时联合仿真实践。通过环境配置、PX4仿真环境搭建、自定义消息生成、Simulink通信实现及实时优化等步骤,提供了完整的无人机位置控制案例,帮助开发者实现高精度的实时联合仿真。
Linux内核的启动过程分析
1.做好内核分析的准备工作 1.1、删除无用文件 (1)官方版本的kernel中是支持各种硬件架构、各种开发板的,因此有很多文件夹和文件和我们无关,在建立SI工程前应该删掉。 (2)现在分析的是九鼎科技移植好的针对X210开发板的kernel,因此其中一些无用文件已经被删掉了。 1.2、建立SI工程并解析 (2)建立方法和uboot中当时讲的是一样的。 1.3、Makefile分析 (1)kernel的Makefile写法和规则等和uboot的Makefile是一样的,甚至Makefile中的很多内容都是一
从零开始搭建一个高性能电流镜:手把手教你设计Wide-Swing Cascode结构
本文详细解析了Wide-Swing Cascode电流镜的设计原理与实战流程。针对低压高性能模拟电路设计的核心挑战,文章手把手指导如何从理论分析、参数计算到仿真验证,搭建一个兼具高输出阻抗和低输出电压裕度的电流镜结构,并深入探讨了偏置电路生成、性能优化及版图匹配等关键要点。
基于 ESP32 的智能药盒提醒装置设计与实现
本装置基于 ESP32 实现了智能药盒的核心功能,硬件选型兼顾成本与实用性,软件设计模块化、易拓展。后续可通过 ESP32 的 WiFi 模块接入物联网平台(如阿里云、OneNet),实现远程设置提醒、服药状态反馈等功能,进一步提升智能化水平。该装置能有效解决老人忘服药问题,具有较高的实用价值与推广潜力。
linux内核启动过程——zImage自解压
linux内核启动过程——基于S3C2410(1)zImage自解压linux内核启动过程——基于S3C2410 (1)zImage自解压本文以流行的Samsung公司的S3C2410,mini2440平台和linux-2.6.29为例,介绍如何在ZIX嵌入式开发环境下探索linux内核启动过程。Linux内核启动一般由外部的bootloader引导,也可以在内核头部嵌入一个loader,实际的应用中这两种方式都会经常遇到。所以要了解内核启动最开始的过程,必须对bootloader如何引导内核有所熟悉。下面
【异常】OpenClaw网关仪表盘 pairing required 报错排查与解决方案
在OpenClaw网关仪表盘页面,完成WebSocket URL、网关令牌等必填项配置后,点击「连接」按钮尝试建立网关连接时,页面下方出现红色报错提示框,核心报错内容为,无法完成网关连接建立,且该报错在令牌配置正确、网络链路通畅的场景下仍会触发。该报错常见于非本地回环地址的访问场景,包括局域网远程访问、公网域名/IP访问、云服务器部署的网关远程管理等场景,本地127.0.0.1回环地址访问通常可正常连接。
linux安装mysql5.6.29_Linux(CentOS7)下rpm方式安装mysql5.6.29
前言这几天准备尝试一下数据备份,想起来在本机虚拟机上装一下mysql,都说很简单。但装起来也遇到了各种问题,也花了几个小时吧。现在总结一下,把过程贴出来,让自己以后比较熟悉,也给大家参考一下。环境过程检查系统是否已经安装了mysql mariadbrpm -qa | grep -i mysqlrpm -qa | grep -i mariadb由于CentOS默认的数据库是mariadb,这个会和m...
零倾覆力矩点(ZMP)
从形式上讲,ZMP 指的是空间中相对于一个平面(通常是地平面)抵消接触力矩的点的集合。这个集合实际上是一个轴,而不是一个点,但为了方便起见,让我们按照传统的推导方法来计算地面平面上的 ZMP。这一推导从任何多刚体系统的牛顿-欧拉运动方程开始:其中,为机器人的总质量,为重力矢量,为系统的重心,为加速度,为固定点的角动量变化率。在右侧,表示净接触扭矩,即施加到机器人上的所有接触扭矩之和,坐标取自质心 (COM)。
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
linux 单步启动_linux内核2.6.29下的kgdb调试
Date : Sunday, July 20 2008* 简介从 2.6.25 开始,Linux 主干内核开始内置了代码级调试器 kgdb。通过 kgdb,开发者就可以在内核代码中设置断点,单步调试和观察变量。为了使用 kgdb,你需要有两个系统。一个作为开发系统,一个作为测试系统嗯。两台机器通过串口线连接。需要调试的内核运行在测试己其上。串口线用于 gdb 连接远程目标。kgdb 已经还可以支持...
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
移植linux2.6.29内核到mini2440(太有帮助了)
移植linux2.6.29内核到mini2440移植linux2.6.29内核到mini2440移植环境:主机:CentOS 5.1交叉编译器:arm-linux-gcc-4.3.2开发板平台:S3C2440(mini2440开发板)注意:红色部分仅供参考,我没有做测试,还请谅解。如果有问题欢迎提出,也欢迎交流。
温度PID控制PLC程序
温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值
lwip-2.0.3
lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。
652



被折叠的 条评论
为什么被折叠?



