当我翻阅时libdevmapper.h有关如何正确使用设备映射器 ioctl(或可能使用 libdevmapper 代替)的线索,我很困惑为什么这里有代码创建/管理树和哈希表。
如果 libdevmapper 为底层设备映射器 ioctl 提供接口,那么在这里包含数据结构的动机是什么?此外,如果内核已经有数据结构来管理所有设备映射,那么似乎任何抽象的库级数据结构充其量只是真实信息的缓存版本。
请记住,我是设备映射器、内核代码和系统调用的新手。我在这里缺少什么?
答案1
这是一个非常笼统的答案——我承认我什至没有读过那个头文件。 (如果您想询问有关它的详细代码问题,堆栈溢出是正确的地方。)
您似乎忽略了数据结构是程序(甚至同一程序的不同部分)通信的方式。通信的每一方都需要理解数据结构,否则消息将难以理解。
因此,例如,内核struct stat
在某个头文件中的某个地方有一个定义。你的程序也有一个,来自 glibc 提供的一些不同的标头(尽管它可能是从内核中复制的)。当您使用stat
系统调用获取文件信息时,您向内核传递struct stat
.内核将信息填充到该数据结构中。然后你的程序读出这些信息。您的程序使用数据结构与内核进行通信。
另一个例子,如果您随后将其传递struct stat *
给程序中的另一个函数(例如,负责显示它的函数),那么您的程序已使用数据结构在其自身的两个部分之间进行通信。
因此,libdevmapper 中的树和哈希表实现,以及通常任何内核功能库标头中的数据结构,将服务于以下几个目的中的一个(或多个):
- 它们是库与内核通信的方式。
- 它们是库与您的程序进行通信的方式。
- 库的开发人员认为它们对您的程序有用(例如,用于跟踪 devmapper 状态),并且他们认为它们足够小和/或足够密切相关,可以包含在内而不会显得臃肿。