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

数字后端零基础入门系列 | Innovus零基础LAB学习Day9 阅读详情

文章来源: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

车机破解避坑指南:为什么你的CarPlay盒子不识别?从USB设备ID解析兼容性问题 本文深入解析车机USB设备兼容性问题,特别是CarPlay盒子不识别的原因,从硬件ID到识别机制全面剖析。通过ADB工具和root权限操作,提供详细的破解方案和兼容性测试结果,帮助用户解决车机与第三方设备的连接问题。 阅读详情

相关推荐

基于YOLOv8的农作物病虫害检测系统设计与实现

国内如中国农业大学的科研团队采用改进的Faster R-CNN模型对小麦病害进行检测,取得了较好的效果。农作物病虫害是影响农业生产的重要因素之一,每年因病虫害导致的农作物减产高达20%-40%。YOLO(You Only Look Once)系列算法作为目标检测领域的代表性模型,以其高效、准确的特点在众多领域得到广泛应用。YOLOv8作为该系列的最新版本,在精度和速度上都有显著提升,非常适合农作物病虫害检测这类需要实时处理的应用场景。然而,现有研究仍存在一些不足:一是模型复杂度高,难以部署到移动设备;

YOLO 778

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

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

weixin_39594296的博客 883

Google Earth Engine:LandTrendr (Landsat Collection 2)全更新使用(代码调用+UI交互)

本文介绍了使用Landsat Collection 2进行连续变化监测的分析方法,包含代码实现和可视化界面两部分。代码部分通过Google Earth Engine平台运行LandTrendr算法,设置参数包括时间范围、光谱指数、变化检测阈值等,最终生成变化幅度和检测年份的可视化图层,并将结果导出至Google Drive。可视化界面部分展示了基于LandTrendr的土地覆盖变化结果,结合Landsat影像进行分析。整个方法实现了从数据处理到结果展示的完整流程,适用于森林覆盖等环境变化监测。

此星光明博客 187

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

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

weixin_39631932的博客 299

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

ltx_69的博客 257

Linux-BIOS/UEFI

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

gongwanzhang的博客 1556

BIOS—>Kernel

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

笃行淡言 1437

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

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

李亚锋老师 1024

打造个人专属的微型linux--启动原理篇

还记得马哥曾总结过每天必的7句话 1、永远不要向任何人解释你自己。 2、别让某人成为你生命中的优先。 3、每天早上两个简单的选择:回睡或起身追逐梦想。 4、不要让在乎我们的人为我们哭泣 5、别在喜悦时许下承诺,忧伤时做出回答,愤怒时做出决定 6、享受生命的每个当下 7、当你持续的说你非常忙碌,你的明天就永远不会来...

weixin_34037173的博客 159

我对Linux的理解

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

AAATTTMMM的博客 255

UEFI与BIOS开发实战:从EDK2固件框架到启动排错全指南

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

weixin_32466193的博客 327

从“烂如石”到开发利器:新版铝telesto固件、SDK与HID协议深度解析

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

weixin_30363509的博客 304

理解 Linux Kernel (1) - BIOS

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

DorMOUSENone的博客 577

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

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

weixin_31736005的博客 354

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

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

xumaojun的专栏 947

解决Linux内核问题实用技巧之 - Crash工具结合/dev/mem任意修改内存

Linux内核程序员几乎每天都在和各种问题互相对峙: 内核崩溃了,需要排查原因。 系统参数不合适,需要更改,却没有接口。 改一个变量或一条if语句,就要重新编译内核。 想稍微调整下逻辑却没有源码,没法编译。 ... 解决每一类问题都需要消耗大量的时间,特别是重新编译内核这种事情。于是,每一个Linux内核程序员或多或少都会掌握一些Hack技巧,以节...

mkelehk的专栏 2107

Linux内核学习篇一:引导启动

对于Linux内核启动问题总是一知半解,今天正好趁着学习课本的机会,写一下自己的体会,尽量通俗易懂,方便日后翻看。好了进入正题~~~~~ 首先需要明确一下几点: 1.引导程序也属于Linux内核的一部分,而不是独立于内核的,所以我们通常所说的“内核 = 引导 + 操作系统”。 1.Linux系统自身想要启动是无法实现的,所以必须要借助引导(软件程序+硬件设备)才行。

Carl_Qi的博客 2086

升级服务器内核解决Kernel内存泄露

集群新增几台机器后,个别机器出现内存使用居高不下的状况.128G的内存使用量长期在80多G,截图如下: 使用smem命令查看内存使用状况 [root@机器名 ~]# smem -twk Area Used Cache Noncache firmware/hardware 0 ...

激进的蜗牛 1791

基于STM32F407实现IAP 现场升级

基于STM32F407实现IAP 现场升级 IAP在flash指定地址中写入程序作为程序版本的flag,APP程序写入后会判断此标记,确定是否需要升级,此例程为IAP部分,APP部分为 FreeRTOS+CAN1+CAN2 已经上传

virtualbox,5.2版本,安全,稳定,和ensp完美契合

VirtualBox 是一款开源虚拟机软件。VirtualBox 是由德国 Innotek 公司开发,由Sun Microsystems公司出品的软件,使用Qt编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。Innotek 以 GNU General Public License (GPL) 释出 VirtualBox,并提供二进制版本及 OSE 版本的代码。使用者可以在VirtualBox上安装并且执行Solaris、Windows、DOS、Linux、OS/2 Warp、BSD等系统作为客户端操作系统。已由甲骨文公司进行开发,是甲骨文公司xVM虚拟化平台技术的一部分。VirtualBox号称是最强的免费虚拟机软件,它不仅具有丰富的特色,而且性能也很优异。它简单易用,可虚拟的系统包括Windows(从Windows 3.1到Windows 10、Windows Server 2012,所有的Windows系统都支持)、Mac OS X、Linux、OpenBSD、Solaris、IBM OS2甚至Android等操作系统。

上一篇: 嵌入式C++——关于C++的效率分析
下一篇: 读Kernel感悟-Linux内核启动-setup辅助程序
TopEmbedded
博客等级 码龄18年 58粉丝 61原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值