Linux 中的设备、设备驱动程序、设备文件和挂载点有何关系(我是 Ubuntu 的初级用户)?
我对它们的理解还比较模糊;我希望有一些清晰的解释可以帮助我了解整体情况。
答案1
在 UNIX 哲学中,所有内容实际上都是目录层次结构中的文本文件,并且这里的所有内容实际上都是该层次结构中各种“文件”的名称
设备是系统可以使用的任何物理硬件或虚拟设备(如 dev/null)=这些通常位于 /dev/ 下。
对于存储设备,所有分区都在 /dev/ 下,需要使用其他位置(通常是 /mnt/ 或 /media/ )下的相应设备驱动程序进行挂载(/dev/sdx 为物理驱动器,/dev/sdx1 /dev/sdx2.. 为分区)。但是,只要您有权限,您也可以将分区挂载为层次结构中的特定目录,例如 /home/ 或任意目录。挂载点基本上是可以访问分区的位置,以及其在层次结构中的表示
设备文件是文件系统层次结构中设备的表示
虽然这通常是抽象出来的,但是在连接设备时,需要必要的驱动程序,以便系统知道如何与相关的物理设备“对话”,对于存储设备、文件系统,完整的挂载命令将包括这一点,但通常是自动的。例如硬盘的通用 libata 驱动程序,以及文件系统的 ext3 或各种 fuse 驱动程序。
答案2
设备:通常是物理实体(即硬件),但也可以只是“设备文件”的缩写和抽象(例如mtd1是闪存中分区的设备名称,但实际上是在实际闪存设备驱动程序之上分层运行的驱动层,以使闪存设备更加块 I/O 友好)。
设备驱动程序:代表操作系统和/或用户请求在设备上执行 I/O 操作的软件。
设备文件(或设备节点):用户可访问设备的文件名,通常位于目录中/dev,具有所有权和权限属性。请注意,某些“设备”(例如以太网端口eth0) 没有用户可访问的设备文件。
挂载点:挂载点是文件系统中的一个目录(例如/mnt)实际上访问另一个文件系统,通常在另一个设备上
答案3
一般来说:
- 设备 = 硬件
- 设备驱动程序 = 操作系统/程序与硬件之间的接口
- 设备文件 = 与驱动程序的接口
- 挂载点 = 对这个不太确定,我认为你说的是“分区中用作根文件系统的物理位置”(维基百科)
答案4
(以下内容过于简单,但应该能给你一个大概的概念)
设备是直接连接到 CPU 的硬件(除非是总线,否则很少见),或通过总线间接连接(总线本身就是设备)。设备可以使用以下四种方法与 CPU 通信:内存地址、I/O 地址、DMA 通道和 IRQ。(需要担心这些的时代早已过去,它随着 ISA 的消亡而消亡)。
我们拥有操作系统的原因之一是提供与各种硬件进行通信的通用接口。因此,编写程序的人可以使用这个通用接口,而不必了解每个特定设备的底层细节。这使得编程更快、更容易。
驱动程序是一种软件,它向应用程序端提供通用接口,然后将该接口的请求转换为设备可以处理的形式(使用前面提到的内存地址、I/O 地址、DMA 通道和 IRQ,或者可能调用其他驱动程序),然后再转换回来。
Linux 是一种 UNIX 风格的操作系统,它使用一种称为 UNIX API 的特定“通用接口”。UNIX 的一个设计目标是使一切看起来都像文件。您可以对文件执行的操作包括:创建、读取、写入、查找和关闭。对于不符合这些概念的内容,还有另一种称为 ioctl 的操作,它可以说是其他所有内容的“万能操作”。
如果您对设备文件发出这些操作的请求,则这些请求不会转到内核的文件系统层,而是直接转到设备。
现在,您有了设备文件,它们可以让您在低级别上与存储设备通信(/dev/sda 等),但存储设备真的很笨。它们通过 UNIX API 所能做的就是为您提供一个 LBA 或数据块(512、2048 或 4096 字节)或存储它(现代硬盘驱动器有数千万个 LBA,甚至更多)。它们不会自行将其组织成文件。例如,写入文件可能涉及写入许多 LBA,并且您需要一个系统来跟踪哪些 LBA 属于哪个文件。这是内核的文件系统层的工作,将对文件的操作请求转换为对设备的操作请求,并使用该设备存储的一部分来跟踪所有内容。
文件系统层是整个目录系统的实现。它是一个树形结构,您可以在该树的各个点连接或挂载块设备。文件系统层需要知道哪个“低级”设备有文件,这就是您需要挂载它的原因。