读Kernel感悟-Linux内核启动-BIOS

UEFI与BIOS开发实战:从EDK2固件框架到启动排错全指南 从计算机启动的底层原理出发,传统BIOS基于16位实模式与1MB寻址,早已难以适应现代硬件;UEFI作为微型操作系统,以模块化阶段和标准协议重构了固件生态。开源固件开发框架EDK2是UEFI规范最主流实现,它提供从驱动编写到Shell调试的完整工具链。理解UEFI引导、Secure Boot、GPT分区等机制,是解决装系统失败与启动异常的关键。本文梳理固件开发的完整知识图谱,涵盖EDK2环境搭建、UEFI应用编写、QEMU仿真验证等实战方法,帮助开发者与运维人员建立系统认知,从容应对固件调试与更新中的各类问 阅读详情

文章来源:http://www.top-e.org/jiaoshi/html/?196.html

 

“真罗嗦,直接告诉我Linux下用glibc库编译出来的C程序真正的入口地址是_start()不就行了么?”臭鸡蛋扑面而来。

嗯,我说了我只是想用一种特别的方式来叙述问题。我更看重探索的过程中体现的思考方式以及其中的乐趣。

回到我们的主题。Linux内核为什么不是从main函数开始执行?事实上,Linux内核源代码里有许多main()函数,但仔细一看。他们都是运行在用户态的。其实,从上一节中可以看到,main()函数只是一个符号而已。很多书上提到start_kernel()。它类似于main()。但正如调用main()的是_start()。在start_kernel之前仍然有很多代码。所以内核的真正入口并不是start_kernel()。

     真正决定程序执行入口的是载入程序。对普通的C程序helloworld来说,Linux内核(严格的说应该是bash)负责设置helloworld的入口点,并且启动helloworld进程的执行。

       于是,问题出现了,Linux内核的载入程序是什么呢?难道是自己载入自己?

这类类似的问题在计算机史上出现过很多次,比如,C程序可以用C编译器来写,那么,C编译器用什么来写呢?当然,解决的方案有很多种,比如,用汇编语言写。那么汇编器用什么写呢?可以用机器语言写。虽然是件痛苦的事,但是一想到能造福这么多人,(发散一下,C编译器可以编译出各种新的语言的编译器或者解释器如perl,然后程序员们再用perl来编出各种复杂的系统),简直太伟大了,那位用机器语言写汇编器的程序员一定会浑身干劲。可以借鉴一下思路,这类问题的常见的解决方式是构造一个简单的系统来解决一个复杂的系统的问题,如此往复,像滚雪球一下,最终把一个极为复杂的问题解决掉。所以,很自然的想到,用一个简单的内核,(不,它仅仅是一段程序,甚至不能称之为内核,因为它的功能很有限)来启动真正的内核。就像用一个小当量的原子弹来引爆氢弹一样。

      本着KISS(keep it simple and stupid)的原则,你第一时间可能会想到BIOS。BIOS通常存在ROM上。随着ROM容量的扩展(达1M甚至更多)PC上的BIOS功能已经很强大了,包括了很多设备的驱动程序。不仅可以进行硬件的检测,还实现了基本的输入输出功能。(basic input / output system,这也是它的本意)。开机时按del键出现的BIOS设置画面就是BIOS的杰作。在BIOS上实现一个OS也不是不可能。事实上DOS就是在BIOS的基础上实现的。

       然而,BIOS的一个致命的缺点是到目前为止它基本上只能在16位实地址模式下运行,毕竟ROM的容量很有限。(当然也不绝对,BIOS也提供了在保护模式下扫描PCI设备的方法,大牛们yy一下实现一个保护模式下运行的BIOS的可行性。)而CPU刚加电时处在16位实地址模式下。它的另一个致命的缺点是太小。因为现代操作系统多种多样,BIOS再强大也无法把所有可能的情况都考虑进去。

不过即使这样,PC机刚启动时,x86 CPU仍然会自动从BIOS开始启动,这是由硬件决定的,因为加电时,寄存器CS里的值为0xffff,IP里的值为0。于是CPU从线性地址0xffff0处开始取指令。0xffff0处是什么地方呢?

运行cat /proc/iomem

前面5行

00000000-0009fbff : System RAM

0009fc00-0009ffff : reserved

000a0000-000bffff : Video RAM area

000c0000-000cc7ff : Video ROM

000f0000-000fffff : System ROM

可以看到0xffff0处是System ROM,也就是BIOS

注意这里的地址是16位实地址模式下的线性地址。

而BIOS能做的事,包括开机时对设备的检测,最后去读硬盘上的第一个扇区(即引导扇区MBR)的512个字节,把它们拷贝到地址为0x7c00处的内存中。到此为止,BIOS的引导使命已经完成。虽然以后Linux内核的引导还要用到BIOS的功能,但引导的使命已经落在其它程序上了。

文章来源:http://www.top-e.org/jiaoshi/html/?196.html

从“烂如石”到开发利器:新版铝telesto固件、SDK与HID协议深度解析 在嵌入式开发与硬件交互领域,固件(Firmware)和软件开发工具包(SDK)是连接硬件能力与应用场景的核心桥梁。固件作为设备的底层操作系统,负责硬件资源的调度与管理,其优化直接决定了设备的响应速度、连接稳定性与功耗表现。而SDK则为开发者提供了标准化的API接口与开发工具链,是构建上层应用生态、实现设备二次开发的技术基础。通过HID(人机接口设备)协议,硬件可以与主机进行标准化的数据交换,极大降低了开发门槛。这些技术的价值在于将通用硬件转化为特定场景下的高效工具,例如在自动化测试、数据采集、自定义宏控制等 阅读详情

相关推荐

深入瑞芯微SDK:手把手解析Uboot、Kernel到Rootfs的镜像生成与烧录

本文深入解析瑞芯微SDK中从Uboot、Kernel到Rootfs的镜像生成与烧录全流程,揭示编译背后的技术细节。通过详细分析SDK架构、镜像生成流水线、分区表定制、Rootfs构建及烧录科学,帮助开发者从会编译进阶到懂原理,掌握系统级开发的关键技术。

weixin_29193359的博客 270

kernel开启启动log_BIOS启动Linux过程介绍

在正式研究BIOS的PCI驱动之前,先科普下Linux的启动过程,顺便简单对比一下legacyBIOS和UEFI,为做区分,legacyBIOS指通过MBR分区启动的老式BIOS,BIOS/UEFI指通过从GPT分区启动的新式BIOS。现代计算机系统的内存都是volatile的,断电即消失,因此OS必须存储在non-volatile的存储介...

weixin_39594296的博客 887

RV1126B SDK移植实战:从DDR配置到USB烧写全解析

本文详细解析了RV1126B SDK移植的核心实战流程,重点攻克了DDR初始化失败与USB烧写两大难题。文章从理解启动流程入手,提供了DDR配置错误的排查步骤、SDK编译配置要点,并深入讲解了USB烧写的完整操作与常见问题解决方案,旨在帮助开发者高效完成系统移植与稳定运行。

weixin_29164497的博客 542

bios阶段更换linux内核,探讨Linux内核启动之BIOS启动阶段

Linux内核启动有很多值得学习的地方,这里我们主要介绍BIOS启动阶段,包括介绍指令寄存器CS:EIP等方面。Linux内核启动代码复杂、庞大,让人感觉难以入手,正是因为它的复杂性,任何一本教材都会把相关的内容进行分类讲解,例如中断处理,文件系统,等等。然而在阅读相关章节时,你是不是常常想弄明白某个相关的数据结构是在什么时候建立的?是在什么时候初始化的?本章讲解BIOS启动阶段。Linux内核启...

weixin_39631932的博客 300

H3C模拟器HCL防火墙路由模式主备配置实验

摘要:本文详细介绍了网络拓扑规划与设备配置方案。运营商仅提供一个接口地址,通过虚IP技术实现双防火墙高可用部署:主备防火墙分别配置10.20.10.1/29和10.20.10.2/29作为实际上联地址,共享10.10.10.2/24虚IP;下联配置172.168.10.0/24网段,核心交换机配置VLAN接口及192.168.10.1、192.168.20.1两个下联接口。文章包含运营商路由器、防火墙(HA配置、VVRP设置)和核心交换机的具体命令行配置步骤,并强调需进行主备切换验证。整个方案实现了单运营商

LQ的博客 1122

腾讯游戏安全组件运行异常的全面解决方案

在使用腾讯游戏时,玩家可能会遭遇游戏安全组件运行异常的问题,这不仅影响游戏的正常启动,还可能在游戏过程中引发一系列问题。本文将详细介绍解决腾讯游戏安全组件运行异常的几种方法,帮助玩家重拾游戏乐趣。腾讯游戏安全组件运行异常是一个复杂的问题,可能涉及服务设置、游戏更新、系统环境优化以及硬件与驱动检查等多个方面。最后,希望本文能帮助玩家顺利解决腾讯游戏安全组件运行异常的问题,让玩家能够无忧无虑地享受游戏带来的乐趣。首先,我们需要从系统的服务管理入手,检查与游戏安全组件相关的服务是否正常运行。

nntxthml的博客 5807

硬件->BISO->启动Linux kernel 过程

ltx_69的博客 261

智能车竞赛轮腿穿越组:GPS+IMU导航绕桩实战技巧(附避坑指南)

本文详细介绍了智能车竞赛轮腿穿越组中GPS+IMU导航绕桩的实战技巧,包括硬件选型、传感器标定、路径规划及多传感器数据融合策略。通过实际案例和避坑指南,帮助参赛队伍提升导航精度和稳定性,避免常见错误。特别强调IMU安装位置和标定对导航系统的重要性。

gin88的博客 583

Linux-BIOS/UEFI

本文详细介绍了Linux系统中BIOS和UEFI的基础知识、配置方法及高级应用。BIOS作为传统固件,负责硬件初始化和操作系统引导,但其16位模式和启动速度较慢存在局限性。

gongwanzhang的博客 1574

手把手教你用gmid方法设计二级运放:从理论到仿真全流程(附避坑指南)

本文详细介绍了使用gmid方法设计二级运放的全流程,从理论到仿真实践,特别针对初学者常见问题提供避坑指南。通过系统化的晶体管尺寸确定技术,帮助工程师在性能、功耗和面积之间找到最佳平衡点,适用于模拟集成电路设计中的关键模块开发。

weixin_29213525的博客 271

基于STM32的家庭环境监测毕业设计(全部资料)

本文设计并实现了一套基于STM32的家庭环境监测系统,具备温湿度、烟雾浓度和PM2.5检测功能,通过OLED屏实时显示数据,并能自动或手动控制风扇、加湿器等设备。系统采用分层架构设计,包含数据采集、处理、显示和控制执行模块,经测试性能稳定可靠。研究结果表明,该系统能有效提升家庭环境监测与控制的智能化水平,但仍存在传感器精度和智能化程度不足等问题,未来可进一步优化硬件配置并引入AI算法提升性能。

3254968421的博客 461

BIOS—>Kernel

当我们打开计算机电源,计算机会自动从主板的BIOS(Basic Input/Output System)读取其中所存储的程序。这一程序通常知道一些直接连接在主板上的硬件(硬盘,网络接口,键盘,串口,并口)。现在大部分的BIOS允许你从软盘、光盘或者硬盘中选择一个来启动计算机。 下一步,计算机将从你所选择的存储设备中读取起始的512 bytes(比如光盘一开是的512 bytes,如果我们从光

笃行淡言 1441

uniapp [安卓苹果App端] - 详细实现下载文件保存到用户手机本地,指定文件存储位置路径及文件夹名称下载并保存,Uniapp app端将文件下载保存并储存到指定目录(手机系统存储空间权限检测)

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,app端下载文件,移动端文件下载,并保存到手机本地存储空间,uniapp下载文件保存到手机本地,iOS下载文件怎么保存,系统读写存储空间权限,下载文件到本地详细流程及源代码,保存自定义目录,uniapp,实现下载文件并保存到本地,文件后缀,如何指定手机的存放目录路径url,点击下载文档到手机中并提示存储位置,如何在uniapp中实现文件下载功能,uniApp文件下载,怎么指定文件保存目录,下载报错,没反应

🏆 前端领域优质创作者 1万+

读Kernel感悟-Linux内核启动-setup辅助程序

文章来源:http://www.top-e.org/jiaoshi/class/ 我们发现,在起点与终点之间,还有几个中转站。最近的一站叫作MBR。BIOS,带你到MBR后,说:“对不起,只能送你到这里了。”那其它几个中转站是什么呢?我们知道,在x86上,保护模式有两种,32位页式寻址的保护模式和32位段式寻址的保护模式。显然,32位页式寻址的保护模式要求系统中已经构造好页表。从16位

李亚锋老师 1030

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

从TDR到DDU:英伟达显卡驱动崩溃与损坏排查修复指南

显卡驱动是操作系统与GPU之间的中间层,负责图形调度、显示输出与计算任务分发;当出现TDR超时恢复、驱动文件损坏或注册表残留时,常以黑屏、花屏、闪退、蓝屏和代码43等形式暴露。借助事件查看器、蓝屏dump与错误码可先区分“驱动崩溃”和“驱动损坏”,再通过DDU干净清装、断网防覆盖、版本锁定与回滚,以及供电、PCIe、内存和超频排除,形成可复用的定位链路。这套方法适用于游戏、渲染、工作站等场景,能减少反复重装驱动的无效操作,并自然落到英伟达显卡驱动崩溃与驱动损坏的系统化排查与修复实践。

weixin_34037173的博客 382

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

我对Linux的理解

硬件(磁盘/CPU内存)>BLOS/UEFI开机>GRUB引导>加载Linux内核>systemd(PID的第一个进程)启动全部服务>用户登录进入Shell命令行。文件权限rwx读写执行,ugo(用户,组,其他),umask控制新建文件默认权限;/根目录,FHS标准规定目录结构:/etc/配置文件,/var动态数据日志,/bin命令,/dev硬件设备。底层数据依然存在磁盘文件;inode:文件真正的元数据,记录权限,大小,磁盘块;三剑客:grep:过滤文本,sed行命令,awk列处理,处理日志,配置文件。

AAATTTMMM的博客 257

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

理解 Linux Kernel (1) - BIOS

前言 在概述,我已经介绍过《理解 Linux Kernel》系列文章的写作原因。我不能担保我所进行的所有试验性操作都是对的,但至少操作我的环境下成功地运行了,并帮助我触及我始终敬畏的硬件&OS 《Linux 内核完全注释》第三章——内核编程语言和环境,描述了用 as86 汇编语言构建 boot 引导程序,在 Bochs 仿真器成功模拟开机运行,最终输出 Loading System…。这就...

DorMOUSENone的博客 579

linux内核bios,BIOS的启动原理——Linux内核设计学习笔记

RAM:随机存取存储器,常见的内存条就是一类RAM,其特点是加电状态下可任意读、写,断电后信息消失。在RAM中什么程序也没有的时候,谁来完成加载软盘中操作系统的任务呢?答案是:BIOS。BIOS的启动原理在了解BIOS是如何将操作系统程序加载到内存中之前,我们先来了解一下BIOS程序自身是如何启动的。从我们使用计算机的经验得知:要想执行一个程序,必须在窗口中双击它,或者在命令行界面中输入相应的执行...

weixin_31736005的博客 357

探讨Linux内核启动之BIOS启动阶段

本文讲解linux内核启动之BIOS启动阶段,640KB的RAM是BIOS设计者自由使用的区域,如何使用取决于 BIOS软件的设计者,4GB的物理地址空间至少被划分为两个部分,一部分是内存的地址空间,另外一部分地址空间用于对BIOS芯片存储单元进行寻址。   Linux内核启动有很多值得学习的地方,这里我们主要介绍BIOS启动阶段,包括介绍指令寄存器CS:EIP等方面。   L

xumaojun的专栏 950

豆瓣到底是什么?靠什么盈利?

自2009年新浪推出微博产品后,中国的社交网络进入了新的格局。之前风靡的人人网、开心网在面对微博的冲击时也纷纷作出相应的战略调整,去粗取精,把握自己独特的产品和平台优势。而一家具备独特定位的社区网站,文青和小清新的聚集地,依旧按照“自我”的路线从容前行,冷眼旁观行业的风云变幻 —— 豆瓣。   成立7年来,豆瓣网一向鲜少出现在媒体面前。但这并不妨碍业界对豆瓣的种种猜测,尤其是在如今微博风生水

风雨同行 4696

494_linux内核学习_0x7C00地址的选择原因

全部学习汇总:https://github.com/GreyZhang/little_bits_of_linux 正式开始看Linux的代码了,先从汇编开始。简单浏览了一下很头大,进而很高兴。这又不是什么工作,也没啥KPI,更没有工作中大跃进的要求。学习其实是一种享受,不会意味着问题很多,也就意味着我会有更多的收获。 先看一段汇编代码的开头,具体如下: 这一段代码基本上是注释,前面4行,说明了一个参数。感觉上,其实是想说SYS...

小灰笔记 1057

从BIOS到内核的过程分析

在上一篇译文中说明了x86内存映射,在实时模式下,要做的工作还真不少,为了让操作系统放在内存开始运行起来时多么辛苦啊!下面将从整体上把握设计思想。 这里主要从内存分布的角度来看这些程序。 第一是BIOS,上电后cpu的IP指针指向BIOS内存区,开始执行BIOS程序。BIOS主要做的工作是 POST(Power On Self Test,上电自检)创建中断向量、设置寄存器 从软盘或

Eliot_shao的专栏 3947

BIOS功能思维导图-根据《Linux内核完全剖析》

总结一下BIOS的几个功能方面: 一般会把这部分功能跟操作系统的启动联系到一起,真正跟启动相关的代码实现应该属于初始化部分。

小灰笔记 1960

installer启动类型是灰色_联想电脑BIOS下引导方式无法修改或BOOT MODE选项为灰色解决方法...

第一种情况:bios中开启了安全启动(secure boot),需要在bios中关闭安全启动才能修改引导模式。解决办法一:关闭安全启动方法:1.关闭安全启动:Secury boot—选择Disabled。参考界面一:联想台式机关闭安全启动(2020款以前台式机)如下图所示;参考界面二:联想笔记本关闭安全启动(2020款以前笔记本)第二种情况:bios中开启了DMA保护,需要在bios中关闭安全启动...

weixin_42551310的博客 8076
上一篇: 嵌入式C++——关于C++的效率分析
下一篇: 读Kernel感悟-Linux内核启动-setup辅助程序
TopEmbedded
博客等级 码龄18年 58粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值