我知道用户应用程序只能在用户模式下运行,这是为了系统安全。相反,大多数驱动程序在内核模式下运行,以访问 I/O 设备。尽管如此,一些驱动程序在用户模式下运行,但被允许访问 I/O 设备。所以我有以下问题。驱动程序和用户应用程序之间的主要区别是什么?不能像某些驱动程序那样允许用户应用程序访问 I/O 设备吗?
谢谢。
我知道用户应用程序只能在用户模式下运行,这是为了系统安全。相反,大多数驱动程序在内核模式下运行,以访问 I/O 设备。尽管如此,一些驱动程序在用户模式下运行,但被允许访问 I/O 设备。所以我有以下问题。驱动程序和用户应用程序之间的主要区别是什么?不能像某些驱动程序那样允许用户应用程序访问 I/O 设备吗?
谢谢。
首先,来自此链接的一些预览:-
应用程序在用户模式下运行,核心操作系统组件在内核模式下运行。许多驱动程序在内核模式下运行,但有些驱动程序在用户模式下运行。
当您启动用户模式应用程序时,Windows(/任何操作系统)会为该应用程序创建一个进程。该进程为应用程序提供了一个私有虚拟地址空间和一个私有句柄表。因为应用程序的虚拟地址空间是私有的,所以一个应用程序不能更改属于另一个应用程序的数据。
除了私有之外,用户模式应用程序的虚拟地址空间也是有限的。在用户模式下运行的处理器无法访问为操作系统保留的虚拟地址。限制用户模式应用程序的虚拟地址空间可防止应用程序更改并可能损坏关键操作系统数据。
在内核模式下运行的所有代码共享一个虚拟地址空间。这意味着内核模式驱动程序不与其他驱动程序和操作系统本身隔离。如果内核模式驱动程序意外写入错误的虚拟地址,则属于操作系统或其他驱动程序的数据可能会受到损害。
另外,从这个链接
软件驱动程序
有些驱动程序根本不与任何硬件设备相关联。例如,假设您需要编写一个可以访问核心操作系统数据结构的工具,而这些数据结构只能由在内核模式下运行的代码访问。您可以通过将工具分成两个组件来做到这一点。第一个组件在用户模式下运行并呈现用户界面。第二个组件在内核模式下运行并且可以访问核心操作系统数据。在用户模式下运行的组件称为应用程序,在内核模式下运行的组件称为软件驱动程序。软件驱动程序不与硬件设备相关联。
此外,软件驱动程序()始终在内核模式下运行。编写软件驱动程序的主要原因是为了访问仅在内核模式下可用的受保护数据。但设备驱动程序并不总是需要访问内核模式数据和资源。所以一些设备驱动程序在用户模式下运行。
驱动程序和用户应用程序之间的主要区别是什么?
区别与潜艇和船舶之间的区别相同。驱动程序依赖于硬件和操作系统。它们通常提供任何必要的异步时间相关硬件接口所需的中断处理。因此,几乎所有它们都在内核模式下运行。然而,如第二段所述,为了防止应用程序损坏关键操作系统数据,用户应用程序必须在用户空间中运行。
此外,并非所有驱动程序都直接与设备通信。对于给定的 I/O 请求(例如从设备读取数据),通常有多个驱动程序,分层在堆栈中,参与请求。堆栈中与设备直接通信的驱动程序称为功能驱动程序;执行辅助处理的驱动程序称为过滤器驱动程序。
不能像某些驱动程序那样允许用户应用程序访问 I/O 设备吗?
应用程序调用操作系统实现的函数,操作系统调用驱动程序实现的函数。驱动程序知道如何与设备硬件通信以获取数据。驱动程序从设备获取数据后,将数据返回给操作系统,操作系统将数据返回给应用程序。
应用程序通过设备驱动程序(而不是操作系统)提供的 API/接口连接到 IO 设备。操作系统处理大多数硬件/软件交互。硬件供应商编写允许操作系统控制其特定硬件的“插件/模块/驱动程序”。因此,使用操作系统提供的接口,您可以编写应用程序来访问 IO 设备。
因此,如果没有驱动程序的帮助,您不能让用户应用程序直接访问硬件,因为访问设备的是层次结构下的所有驱动程序,因为设备驱动程序是用可以与硬件通信的低级语言编写的,而用户应用程序是用高级语言编写的。
另外,请检查此答案以了解有关各种操作系统中驱动程序地址空间的更多信息。