linux2.6.29 启动过程详细分析

移植linux-2.6.29+busybox最小系统到单板OK6410 系统:ubuntu 10.04.4 单板:ok6410 编译器:arm-none-linux-gnueabi- 搭建开发环境详见ubuntu 10.04.4开发环境配置。 目标: 一.配置 编译android-2.6.29,放到OK6410上,板子串口正常输出 二.移植DM9000网卡驱动,配置内核,支持nfs挂载网络文件系统 一.配置 编译android-2.6.29,放到OK64 阅读详情

突然心血来潮,想自己写个模块,于是就把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源码后会详细解释
 

29、Linux 启动加载器与启动过程全解析 本文深入解析了Linux系统的启动加载器与启动过程,详细介绍了GRUB Legacy和GRUB 2的使用及区别,探讨了不同启动加载器的适用场景。同时,文章还涵盖了Linux启动过程的各个阶段以及主流的初始化方法(如systemd、SysV和Upstart),并对比了它们的特点和应用场景。通过本文,读者可以全面了解Linux启动机制,并掌握启动问题的排查和修复方法。 阅读详情

相关推荐

MySQL 5.6.29 Linux安装及配置实战

MySQL 5.6.29作为开源数据库的佼佼者,其更新带来了诸多改进和新特性。这个版本特别专注于性能和可扩展性的优化,对于中大型企业应用,提供了更加稳定的数据库解决方案。它引入了对InnoDB引擎的增强、改进了复制功能,并提高了对云计算平台的支持。Linux_glibc2.5.x86_64架构是基于x86_64指令集的Linux操作系统环境下的一个版本,该架构采用了glibc2.5版本的C库。

weixin_29092787的博客 652

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

玩意儿的专栏 1026

Linux环境下MySQL 5.6.29源码编译安装指南

在Linux系统中安装MySQL数据库是开发和运维工作中的基础技能。本章将介绍Linux下安装MySQL的两种流行方法:使用官方提供的安装包和源码编译安装。

weixin_31974443的博客 1203

Linux-2.6.22.6启动分析之一:make s3c2410_defconfig

草稿

brochip的专栏 2109

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

Hello for world 1962

告别编译失败:详解Keil MDK中ARM编译器V5与V6的区别及项目迁移选择

本文深入解析Keil MDK中ARM编译器V5与V6的核心差异,提供STM32项目迁移的完整指南。从代码生成策略、优化重点到语法支持,详细对比两版本特性,并给出项目兼容性评估框架和双版本共存配置方案,帮助开发者高效解决编译器版本冲突问题。

weixin_28684757的博客 516

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上一直使用的

yiyilo的专栏 833

什么是以太网链路聚合

以太网链路聚合技术通过将多个物理端口捆绑成逻辑端口,可显著提升网络性能。该技术能增加总带宽(各链路带宽之和)、提高可靠性(故障秒级切换)并实现智能负载分担。主要分为手工模式和基于LACP协议的动态模式,后者能检测链路故障更可靠。配置时需确保接口参数一致、模式匹配,适用于核心交换、服务器接入等场景。华为设备通过创建Eth-Trunk接口、指定LACP模式并添加成员接口即可完成部署。这项成熟技术能以低成本解决带宽瓶颈和可靠性问题,是构建高速稳定网络的关键方案。

lai_2020的博客 675

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复制到/

wulong710的专栏 1443

基于MATLAB/Simulink与WSL2的ROS2实时联合仿真实践

本文详细介绍了基于MATLAB/Simulink与WSL2的ROS2实时联合仿真实践。通过环境配置、PX4仿真环境搭建、自定义消息生成、Simulink通信实现及实时优化等步骤,提供了完整的无人机位置控制案例,帮助开发者实现高精度的实时联合仿真。

red88的博客 204

Linux内核的启动过程分析

1.做好内核分析的准备工作 1.1、删除无用文件 (1)官方版本的kernel中是支持各种硬件架构、各种开发板的,因此有很多文件夹和文件和我们无关,在建立SI工程前应该删掉。 (2)现在分析的是九鼎科技移植好的针对X210开发板的kernel,因此其中一些无用文件已经被删掉了。 1.2、建立SI工程并解析 (2)建立方法和uboot中当时讲的是一样的。 1.3、Makefile分析 (1)kernel的Makefile写法和规则等和uboot的Makefile是一样的,甚至Makefile中的很多内容都是一

weixin_44705391的博客 2563

从零开始搭建一个高性能电流镜:手把手教你设计Wide-Swing Cascode结构

本文详细解析了Wide-Swing Cascode电流镜的设计原理与实战流程。针对低压高性能模拟电路设计的核心挑战,文章手把手指导如何从理论分析、参数计算到仿真验证,搭建一个兼具高输出阻抗和低输出电压裕度的电流镜结构,并深入探讨了偏置电路生成、性能优化及版图匹配等关键要点。

weixin_29294975的博客 626

基于 ESP32 的智能药盒提醒装置设计与实现

本装置基于 ESP32 实现了智能药盒的核心功能,硬件选型兼顾成本与实用性,软件设计模块化、易拓展。后续可通过 ESP32 的 WiFi 模块接入物联网平台(如阿里云、OneNet),实现远程设置提醒、服药状态反馈等功能,进一步提升智能化水平。该装置能有效解决老人忘服药问题,具有较高的实用价值与推广潜力。

weixin_42300449的博客 1045

linux内核启动过程——zImage自解压

linux内核启动过程——基于S3C2410(1)zImage自解压linux内核启动过程——基于S3C2410 (1)zImage自解压本文以流行的Samsung公司的S3C2410,mini2440平台和linux-2.6.29为例,介绍如何在ZIX嵌入式开发环境下探索linux内核启动过程。Linux内核启动一般由外部的bootloader引导,也可以在内核头部嵌入一个loader,实际的应用中这两种方式都会经常遇到。所以要了解内核启动最开始的过程,必须对bootloader如何引导内核有所熟悉。下面

y296144646q的专栏 4233

【异常】OpenClaw网关仪表盘 pairing required 报错排查与解决方案

在OpenClaw网关仪表盘页面,完成WebSocket URL、网关令牌等必填项配置后,点击「连接」按钮尝试建立网关连接时,页面下方出现红色报错提示框,核心报错内容为,无法完成网关连接建立,且该报错在令牌配置正确、网络链路通畅的场景下仍会触发。该报错常见于非本地回环地址的访问场景,包括局域网远程访问、公网域名/IP访问、云服务器部署的网关远程管理等场景,本地127.0.0.1回环地址访问通常可正常连接。

奶爸的编程之路,也就一周冷个三天 1080

linux安装mysql5.6.29_Linux(CentOS7)下rpm方式安装mysql5.6.29

前言这几天准备尝试一下数据备份,想起来在本机虚拟机上装一下mysql,都说很简单。但装起来也遇到了各种问题,也花了几个小时吧。现在总结一下,把过程贴出来,让自己以后比较熟悉,也给大家参考一下。环境过程检查系统是否已经安装了mysql mariadbrpm -qa | grep -i mysqlrpm -qa | grep -i mariadb由于CentOS默认的数据库是mariadb,这个会和m...

weixin_34375356的博客 302

零倾覆力矩点(ZMP)

从形式上讲,ZMP 指的是空间中相对于一个平面(通常是地平面)抵消接触力矩的点的集合。这个集合实际上是一个轴,而不是一个点,但为了方便起见,让我们按照传统的推导方法来计算地面平面上的 ZMP。这一推导从任何多刚体系统的牛顿-欧拉运动方程开始:其中,为机器人的总质量,为重力矢量,为系统的重心,为加速度,为固定点的角动量变化率。在右侧,表示净接触扭矩,即施加到机器人上的所有接触扭矩之和,坐标取自质心 (COM)。

机器人控制与仿真应用 2372

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

linux 单步启动_linux内核2.6.29下的kgdb调试

Date : Sunday, July 20 2008* 简介从 2.6.25 开始,Linux 主干内核开始内置了代码级调试器 kgdb。通过 kgdb,开发者就可以在内核代码中设置断点,单步调试和观察变量。为了使用 kgdb,你需要有两个系统。一个作为开发系统,一个作为测试系统嗯。两台机器通过串口线连接。需要调试的内核运行在测试己其上。串口线用于 gdb 连接远程目标。kgdb 已经还可以支持...

weixin_30573089的博客 336

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开发板)注意:红色部分仅供参考,我没有做测试,还请谅解。如果有问题欢迎提出,也欢迎交流。

2315

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

上一篇: 剖析Linux系统启动过程
下一篇: u-boot 启动过程 —— 基于S3C2410
jun2ran
博客等级 码龄19年 104粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值