固件与驱动的区别_鼠标固件是什么,大牛带你直击优秀开源框架灵魂

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

我们可以在许多设备上看到固件,包括计算机、手机、遥控器、游戏机、智能手表、USB 驱动器和各种嵌入式系统。即使是电视遥控器也有一个预装的固件,可以实现你按下按钮的时候电视换台操作。

2. 驱动

驱动(Drive):驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。当计算机程序请求与某个硬件设备交互时,设备驱动程序充当硬件设备与使用它的程序之间指令的转换器。

操作系统并不支持机器上的所有硬件,所以一般来讲硬件厂商都要为自己的硬件编写驱动程序。

每个驱动程序都旨在为特定或一组设备工作。在计算机上,驱动程序使用各种总线接口来联系设备。此外,驱动程序一般不直接与用户交互,所以很多用户完全不知道它们的存在。

驱动程序的开发需要非常小心,因为它直接与硬件打交道,同时也与操作系统打交道。如果设备驱动程序出现问题,可能会导致系统崩溃,这就是为什么需要专业人员或团队来为设备编写驱动程序的原因。

但是为什么不把 Firmware 做的很完美,做的不需要驱动支持呢?因为有不同的操作系统,而这些操作系统对于操作硬件的方式完全不同。所以不同操作系统的驱动是不能兼容的,原因就是驱动是为操作系统服务的。


固件:Firmware. 就是写入EROM(可擦写只读存储器)或者EEPROM(电可茶歇可编程只读存储器)中的程序

固件是只设备内部保存的设备“驱动程序”,通过固件,操作系统才能按照标准的设备驱动实现特定机器的运行运作,比如光驱,刻录机等都有内部固件。

固件是担任着一个系统最基础最底层工作的软件。而在硬件设备中,固件就是硬件设备的灵魂,因为一些硬件设备除了固件以外没有其他软件组成,因此固件也就决定这硬件设备的功能以及性能。

手机、数码相机、mp3、mp4、路由器、电子书、交换机、猫、PSP、PS3、NDS、XBOX、U盘、主板、打印机的BIOS(BIOS就是一种固件)、显卡的BIOS。

固件既然是软件,就有大小之分。大的可有几百兆,小的也许只有几K,甚至不足1K。

而对于非独立的电子产品,比如硬盘、鼠标、BIOS、光驱、U盘等设备,固件就是指其最底层的,让设备得以运行的程序代码。


固件与驱动的区别:

驱动和固件(firmware)都是代码,前者为软件服务,后者为硬件服务。

随着计算机体系结构的发展,硬件的种类开始变多,操作系统的种类也变多了。
这个时候,因为各种技术的、商业的原因,硬件厂商希望自己的硬件能被更多的软件厂商使用,所以就需要在硬件之上做一些封装,让自己的硬件操纵起来更容易,这个时候就要有firmware这种东西了,它简化了软件与硬件的交互。

但是为什么不把fimware做的很完美,做的不需要驱动支持呢?因为有不同的操作系统。

不同的操作系统,对于操作硬件的方式完全不同,在Windows里应用态是无法直接写IO端口的,而在嵌入式系统里,一般都不限制直接操作IO端口。所以,硬件厂商一方面为了自己的硬件能被软件更简单的使用,就需要写firmware,而另一方面为了兼容各种操作系统,又不能把firmware写的太死,必须预留足够的余地让软件自由发挥——软件的自由发挥就是驱动。

不同操作系统的驱动是不能兼容的,原因就是驱动是为操作系统服务的,有的操作系统是单线程的,有些操作系统不允许动态申请内存,所以不同的操作系统要操作硬件,就要根据自身的特性编写对应的操作代码,这就是驱动存在的意义——适应系统需要。

假如世界上只有一种操作系统,并且版本永远不会改变,那么firmware和驱动就可以融合在一起,但这只能一个不现实的梦想,要知道民用操作系统和工业控制操作系统差别是十分巨大的。

从计算机领域来说,驱动和固件从来没有过明确的定义,就好像今天我们说内存,大部分人用来表示SDRAM,但也有人把Android里的“固化的Flash/Storage"称为“内存”,你不能说这样说就错了,因为这确实是一种“内部存储”。
但在Linux Kernel中,Driver和Firmware是有明确含义的,其中Driver是控制被操作系统管理的外部设备(Device)的代码段。很多时候Driver会被实现为LKM,但这不是必要条件。driver通过register_dirver()注册到总线(bus_type)上,当某个device被注册到同样的总线的时候,driver和device会通过一定的策略进行binding,最终在probe()函数中由driver实际控制对应的设备,并把对该设备的控制接口注册到Linux的其他子系统上(例如字符设备,v4l2子系统等)。
而Firmware,是表示运行在非“控制处理器”(指不直接运行操作系统的处理器,例如外设中的处理器,或者被用于bare metal的主处理器的其中一些核)中的程序。这些程序很多时候使用和操作系统所运行的处理器完全不同的指令集。这些程序以二进制形式存在于Linux内核的源代码树中,根据配置,可以直接集成到最终的映像中,或者被拷贝到指定的位置。当driver对device进行初始化的时候,通过load_firmware()等接口,可以把指定的firmware加载到内存中,由驱动传输到指定的设备上。
所以,总的来说,其实driver和firmware没有什么直接的关系。


相同点都是管理硬件的,区别是随谁一起发布。随硬件一起发布的叫固件,随软件一起发布的叫驱动。

随硬件一起发布是因为没有固件,硬件本身无法工作,如bios。随软件一起发布是因为为没有它软件无法在目标硬件上工作,如linux驱动。说白了只看出身立场,不看能力。

软件厂商和硬件厂商之间有一个接口界面,这个界面下的软件通常叫firmware,由硬件厂商提供,之上的操作硬件的叫驱动,有软件厂商提供。这个界面可以是大家一起订立的,也可以是软件厂商定义的,也可以是硬件厂商定义的。硬件厂商定义的话,通常倾向于把界限网上推,这样他能干更多的事情,能对软件友好,从而提高市场占有率。软件厂商定义的话,倾向于往下推,这样它可以要求硬件厂商开放更多硬件信息,软件可以做更多优化。通常的结果是大家定义一个最合适的界限,然后都想越过这个界限。比如说uefi,它做了很多驱动做的事情,试图取代驱动。而linux内核也不肯放弃驱动,所以选择不使用uefi提供的好多功能。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
3203705474)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值