固件,驱动,操作系统,应用

  • 对于初学而言,我对固件,驱动产生一个大大的疑问,尤其是在linux 动态加载固件的时候。不是说好固件写在板子上不能动吗?而且怎么感觉固件和驱动没啥区别,我都能加载到板子了我直接写驱动不就好了吗,那我怎么知道这东西到底是固件还是驱动。
  • 由于网上缺少关于固件和驱动的说明,都是一堆文字巴拉巴拉的愣是分不清驱动和固件啥区别,被迫自己查资料搞懂固件,驱动,操作系统,应用之间的层次,不在迷糊的使用。
  • 以下会列举一些例子更明了说明,当然,这是个人理解,你有更好理解可以说,但不要乱喷,毕竟这是个人笔记,写给个人瞅的,公开是为了白嫖别人的时候心安理得。
  • 开发人员谨记:路径非必要不用中文,懂得都懂,不懂的等你报错找不到bug就懂了

一、固件,驱动,操作系统,应用定义

  • 固件的定义: 固件(Firmware)是一种嵌入到硬件设备中的软件,详细资料可以自己查,但他就是一个软件,他的发展后面会讲到,很多公司喜欢叫FW,firmware,就是不用中文。
  • 驱动(Driver) 驱动程序,简称驱动,是一种软件程序,是让系统识别你插了个什么设备,接收设备信息用的,具体后面讲。
  • 操作系统(Operating System,OS: 操作系统是管理计算机硬件与软件资源的程序,是计算机系统的核心与基础软件,本质也是软件
  • 应用(Application): 应用,通常指应用程序(Application Program),是为了满足用户在特定领域或特定任务需求而开发的软件,它运行在操作系统之上.

综合上诉,这些都是一堆软件,由于侧重点不一样,运行的地方不一样,给了不同的名字

二、what is firmware??

  • 固件定义大概的发展史:
    • 早期计算机系统
      在计算机发展的早期,硬件和软件的界限相对模糊。当时的计算机系统为了实现基本的功能,需要一些程序来控制硬件的启动、初始化和基本操作。这些程序通常被直接烧录到只读存储器(ROM)等硬件芯片中,以便在计算机开机时能够立即运行,为整个系统的运行提供最基础的支持。这种将软件与硬件紧密结合,固化在硬件中的程序就是固件的雏形。简而言之就是懒得每次都导入,干脆写死在里面的初始化软件
  • 固件:处于最底层,直接与硬件电路紧密关联。它是固化在硬件设备内部的软件程序,通常存储在只读存储器(ROM)或闪存(Flash)中,是硬件设备的一部分,其设计目的是为硬件提供最基本的控制功能,实现对硬件底层的直接管理和操作。例如,BIOS(基本输入输出系统)是计算机主板上的固件,它在计算机启动时负责初始化硬件设备,检测系统配置,并为后续的操作系统加载做好准备。
  • 驱动程序:位于固件之上,操作系统之下。它是一种特殊的软件,其作用是充当操作系统与硬件设备之间的桥梁。驱动程序通过调用固件提供的功能,将操作系统发出的高层指令转换为硬件能够理解的底层操作命令,从而实现操作系统对硬件设备的控制和管理。例如,显卡驱动程序会将操作系统中的图形渲染指令转化为显卡能够执行的具体操作,以实现图像的显示。

三、问题来了

相信看到这里懂的人已经懂了,没懂的人已经没懂了,反正我是没理解,干的发慌。
按照上面说的层次如下图(固件是在硬件里面的,图是从嵌入式系统设计师教程掏的):
手打

app
操作系统
驱动
固件+硬件

虽然回头看这些疑问属实有点憨憨了,但还是记一下,毕竟疑问源于未知,万一有和我一样的,让我嘲笑你

  • 按照我的理解,驱动是对一个设备的进行初始化,把设备的一些功能封装成api交给上面的操作系统直接调用,比如板子直接控制寄存器1,0点灯,我封装一下Turn_ON_Light,直接给上面用,说白了就是套娃,简化操作,作为一个桥上传下达。
  • 然后我接触到了固件,他说这玩意是在硬件里面的,也是初始化,也把一些硬件操作封装成api,比如打开led,封装一个函数,点灯封装一个函数?说是直接和硬件打交道。我C,这不是驱动吗??那固件直接操作硬件,作为桥梁,我再来一个驱动干啥。这两玩意貌似功能重复了呀。一座桥能到对岸,非要建一半另一半该坐船过河??
  • 我写一个代码,这个代码,直接识别设备,对设备硬件直接操作,并把这些子操作合起来,封装一个个函数,不就好了吗?这不就是驱动的定义吗。比如我控制打印机,写个驱动,该出墨操作出墨,该换纸操作换纸,然后一个大封装print函数,然后你系统用不就完事了吗。非要写一个代码堆到板子卡一下内存??
  • 比如说,我手里有一个开发板,我点个灯烧进去,这个代码是固件还是驱动?固件是初始化硬件,按理说驱动不也是封装硬件接口成api,初始化硬件吗,所以我是写了个驱动进板子?
  • 那如果我要对一个开发板写驱动怎么分清我在写驱动还是写固件,手里掏一个STM32,好,一手点灯代码烧录,我说我写进去了,嗯,他是固件?因为烧进去啦?那我遇到linux动态加载固件我怎么分,它里面的固件直接放操作系统上的。

四、正解

学习一样东西,最后还是追溯到由来,从他萌芽开始瞅他的发展史,就知道为什么要这么干。存在必有道理(意思是他出现了一定有他的理由,不是存在即合理,有时候针不“”河狸”)

  • 前面说到早期的前辈把一些必要的启动项,硬件初始化直接导入硬件,这些程序和数据可以被看作是固件的雏形。随着微型处理器,嵌入式设备的发展,固件就定下来了。

  • 关键来了,起初固件就是驱动,起初没有驱动这个东西,计算机还是命令行界面是直接进行硬件交互通信的,插进电脑无需识别,直接通信协议下命令(你现在玩的裸机开发板)。就是我上面产生的问题(非要整个驱动和固件的答案:计算机系统发展起来了,要满足操作系统不要过于臃肿,就把设备控制程序单独拉出来,叫驱动。毕竟设备一堆,要分一下这是啥什么设备,但又不能都往内核里面干。啥设备控制都在里面,那不得炸。

  • 发展到现代,

    • 固件就是里面有对自身设备的一套控制api,初始化自身设备,向被接入电脑系统发送自身设备信息,让电脑对应驱动接收
    • 驱动,就是电脑操作系统内核被单独裁剪出来的,可在需要的时候安装的软件(装在电脑操作系统上的),主要是用来识别接入设备发送而来的信息,确定这是什么设备。有需求的情况下对设备固件的功能api进行二次封装(驱动商会写,开发的话下面会举例)。没有驱动的话,你插入设备,电脑操作系统认不出来你加进去是什么玩意(这是神马??),当然你闲着无聊也可以直接通过连接端口发指令,直接像早期电脑一样指令操作设备固件写好的功能,就像电脑WiFi内置好有固件驱动,UI界面也不妨碍你直接调用固件指令

    更新2025/3/11:这种在操作系统的驱动用设备驱动这个专业词更合适,而驱动这个词本身泛指性,大多博客包括讲师都只能意会出来,这是日常用语本身会出现的先入为主的偏差。

    “驱动” 的泛指性:其实是既包含硬件也包含软件等多种层面的宽泛概念。除了硬件的电力驱动、马达驱动等,在软件领域也有像事件驱动、数据驱动等编程模型或架构概念,这些和硬件关系不大,主要是从软件运行机制角度来说的。

    区分:一般而言研发人员讲驱动,可以直接理解成操作系统的设备驱动。而写在硬件本身的像uboot等称为固件

    混淆:当然我们常识认知的驱动,他就是电力驱动,马达驱动这些偏硬件且涵盖范围更广,而固件本身也应该被称为写入硬件底层的驱动(泛指)。所以常识认知驱动与固件重合,无法区分。但讲师博客却说驱动补固件,完整的说应该是设备驱动固件,固件就是我们泛指的写入硬件底层驱动,为了区分研发人员还是叫固件的好。当然,很多讲师教学驱动也会混淆固件一起讲,他也讲不清边界线在哪里,你也无法认知到固件,等后面细分的时候就理所当然懵逼。

    • APP ,操作系统使用设备:就是在驱动识别出来这个设备是什么玩意后,就可以通过程序的界面点击,点击由操作系统响应形成指令,操作系统的指令传给驱动,驱动收到后调用二次封装的接口转化成 固件里面的api功能接口调用指令,对设备下达直接指令操作设备(牛马起来干活!!)
  • 以下是豆包原话:

    固件的由来
    早期计算机系统:在计算机发展的早期,硬件和软件的界限并不像现在这样清晰。当时的计算机系统相对简单,功能也较为有限,一些基本的控制程序和数据直接存储在硬件设备的只读存储器(ROM)中,这些程序和数据可以被看作是固件的雏形。它们主要用于实现硬件设备的基本启动和初始化功能,比如引导计算机启动、进行简单的硬件自检等。
    微处理器出现后:随着微处理器的出现和大规模集成电路技术的发展,硬件设备变得越来越复杂,功能也越来越强大。为了使硬件设备能够更好地发挥其功能,需要在硬件中集成更多的程序和数据来实现各种特定的任务。于是,专门为特定硬件设备设计的、存储在非易失性存储器中的程序和数据逐渐形成了现代意义上的固件。例如,在早期的打印机中,就开始使用固件来控制打印头的运动、字符的生成和打印格式的设置等。
    嵌入式系统兴起:嵌入式系统的兴起进一步推动了固件的发展。在嵌入式设备中,如手机、路由器、智能家居设备等,固件扮演着至关重要的角色。它不仅要实现硬件设备的基本功能,还要与外部环境进行交互,处理各种传感器数据、控制执行机构等。固件的功能不断扩展和完善,成为了嵌入式设备不可或缺的一部分。
    驱动的由来
    早期操作系统与硬件交互:在早期的计算机系统中,操作系统相对简单,硬件设备也较少。操作系统通常直接与硬件进行交互,通过特定的指令和端口来控制硬件设备的工作。随着计算机系统的发展,硬件设备的种类和数量不断增加,每种硬件设备都有其独特的工作原理和控制方式。为了使操作系统能够更好地管理和使用这些硬件设备,避免操作系统代码过于复杂和臃肿,人们开始将硬件设备的控制程序从操作系统中分离出来,形成了最初的驱动程序。
    即插即用技术的推动:随着计算机硬件的不断更新换代和即插即用(Plug and Play)技术的出现,驱动程序的重要性日益凸显。即插即用技术要求计算机系统能够自动识别和配置新连接的硬件设备,这就需要有相应的驱动程序来支持。当用户将新的硬件设备插入计算机时,系统会自动查找并安装对应的驱动程序,使硬件设备能够立即正常工作。这一技术的发展促使硬件厂商更加重视驱动程序的开发和维护,以确保其产品能够与各种操作系统和计算机系统兼容。
    操作系统的发展与完善:操作系统的不断发展和完善也对驱动程序提出了更高的要求。现代操作系统具有更加复杂的体系结构和功能,需要通过驱动程序来实现对各种硬件设备的高效管理和利用。驱动程序不仅要实现硬件设备的基本功能,还要与操作系统的内核、文件系统、网络系统等进行良好的交互,以提供稳定、高效的硬件支持。

五、开发

  • 对于嵌入式设备而言,我的板子内存就这么丁丁,固件必然不写那么大,那固件的功能api就简陋一点(当然你给板子加个1t内存,有钱当我没说),固件就实现简单的加载启动,对个别元器件进行初始化,封装提供基本接口就好。
  • 这时候驱动就要好好写了,要二次封装好硬件提供的api功能接口,例如说固件就提供了寄存器操作,驱动就要编写好封装操作寄存器开灯,初始化led等函数给上层开发人员,你总不可能让app编写人员启动一下显示屏操作寄存器,画个图操作寄存器把?
  • 关于编写一个点灯代码烧录到板子,这是一个固件。把电脑连接关了,板子里面代码没有被擦除,依旧可以点灯。电脑操作系统是识别不了你这个板子是什么设备的,他不知道这是洗衣机还是电灯,打印机啥的,最多识别出你的串口(因为你装了串口驱动,板子的串口向电脑串口驱动,提供了识别串口信息)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值