内核和驱动程序之间的区别是什么

what is difference between kernel and driver?

本文关键字:区别 是什么 之间 驱动程序 内核      更新时间:2023-10-16

由于我的主要语言是C++,并且经常因其硬件功能而受到赞扬,所以我决定深入了解计算机体系结构。当我浏览一些东西时,我偶然发现了设备驱动程序。所以,很自然,我决定查一下。根据我的理解,设备驱动程序是一个处理特定硬件组件的计算机程序。我也知道内核是一个计算机程序,它充当着从软件到硬件的桥梁。出于某种原因,我的大脑无法区分这两者。当谈到windows平台时,有人能向我解释一下其中的区别,并解释一下他们扮演的不同角色吗。提前谢谢。

这些术语并没有得到很好的定义。但这里有一些关于这个主题的胡言乱语。。。

请注意,当你安装Windows(或Linux、MacOS或其他什么)时,你不仅仅是在安装基本的操作系统,这会很无聊(至少对那些不是很好程序员的人来说)。您还安装了用户界面、Shell(命令提示符)、Web浏览器、向打印机发送信息的后台打印程序、一系列"有用"的服务流程等等。这些都是在操作系统上运行的"应用程序",但它们是大多数人所说的"操作系统"的重要组成部分。核心"操作系统内核"是几兆字节,但典型的操作系统安装是几十千兆字节。

操作系统的"内核"是最核心的,没有内核就没有操作系统-至少,它可以处理加载应用程序、在任务之间切换、计时等。为了为特定的硬件制作一个小型操作系统,我们可以将串行端口和定时器的"设备驱动程序"集成在操作系统中,例如,定时器可能是十几行代码,并且一个简单的串行驱动器将是100-200条线路。但它只能在与它设计的硬件100%兼容的硬件上运行。改变寄存器中一位的含义,它可能会完全停止工作。

如果我们想让我们的操作系统在有一些可变硬件的设备上运行,那么PC就是一个很好的例子,说明了如何从本质上改变系统中的几乎每个组件,并最终获得合理一致的体验。现在,我们要么需要编写适用于nVidia和AMD/ATI图形的代码(如果我们想支持所有PC硬件,还需要英特尔和其他一些公司),而且在这几个品牌中有几十种不同型号的图形硬件。网卡(或内置网络)、硬盘控制器、CD/DVD驱动器、USB控制器和USB设备等。

在我们深入研究之前,我们需要解释一下"用户模式"answers"内核模式"——这是硬件中的"保护级别"——当你为Windows(以及Linux、QNX、Android、MacOS、iOS等)编写常规C或C++应用程序时,用户模式就是你的应用程序的运行状态。用户模式在不同的进程之间提供了安全性[假设操作系统正常工作],并且你的"野生指针"不会意外地导致你的整个硬盘被格式化,等等。

内核模式允许"自由访问一切",如果你真的想这样做,硬件中没有任何东西可以阻止你的代码更改内存映射和读取机器中的任何内存。或者您的网络驱动程序将其数据包直接写入显示器,硬盘驱动程序将数据直接写入web浏览器历史缓冲区,等等。只有良好的编码和严格遵守海关和指南才能防止这种情况发生。

驱动程序会向内核"注册"自己,说"我会处理这种硬件[例如nVidia显卡],所以请告诉我你是否有这种硬件,或者它稍后是否出现(热插拔设备)"。这是通过一个定义的接口来实现的,该接口通常因硬件类型而异,因此网络驱动程序和硬盘控制器具有不同的接口,当然图形卡的行为也与这两者不同。

实际上,两个级别的驱动程序-"内核驱动程序"(在linux中为"内核模块")和在用户模式下运行的"服务"(因此不能直接访问所有硬件,但必须使用操作系统内核和驱动程序来访问实际硬件[可能有一些由操作系统/内核驱动程序提供的"漏洞",允许用户模式侧访问需要访问的特定硬件].这个模型是用来让驱动程序更安全一点的,所以大部分工作都是在用户模式下完成的[在用户模式中,操作系统提供了一些安全性,可以防止错误的代码读取/写入它实际上不应该访问的东西(如显示驱动程序写入硬盘缓存)]。

驱动程序还有助于保持核心内核的简单性——类似于在模块中编写其他代码和在模块内编写函数的方式——"主"代码不必知道特定模块的所有功能。

不同的操作系统有不同的模型来表示操作系统本身知道多少,以及分离出多少。在一个极端,你有"微内核",它本质上只是一个任务管理器,一点时间保持,仅此而已。如果你想读取文件,你需要安装一个文件系统模块,这是它自己的小"任务",如果你想使用网络,有一个"任务"要安装,等等。在另一端,你有像Windows和Linux这样的"单片"内核,几乎所有的东西都内置在内核中——至少在内核具有打开文件、向网络发送数据包等功能的程度上——当然有驱动程序来处理与硬盘控制器和网络控制器的实际接口,但文件存在并且可以打开、关闭、读取、写入等的知识都在内核中。

就像选择一种政治模式来管理一个国家一样,所有的模式都让人们说他们最喜欢的模式比其他模式更好。事实可能没有那么极端。

如果你缩小内核的类型,即单片内核、微内核、混合内核、外内核(更像是链接到内核库中的应用程序)等,你会看到区别。

例如,在纯单片内核中,设备驱动程序被构建到内核中以形成单个实体,而对于更实用的混合内核(如Windows和Linux),驱动程序是作为"插件"按需加载的,以扩展内核功能。对于微内核,驱动程序被视为其自身实体中的应用程序(或服务器)。

通常,驱动程序为特定的物理或逻辑设备提供详细的实现,而内核则为驱动程序提供一组接口,并在更高的抽象级别(HAL)中管理它们。

顺便说一句,内核所做的远不止管理硬件资源。