当同一驱动程序的多个实例同时 运行 时,内核如何处理对 proc 文件的读取操作
How does the kernel handle a read operation on proc files when several instances of the same driver are running simultaneously
当同一驱动程序的多个实例同时 运行 时,我对 proc 文件的处理方式有疑问。
让我们假设我的系统同时运行同一个驱动程序的几个实例,但其中只有一个(根据一些内部决策)创建了一个 proc 文件并维护在读取文件时应该写入的信息。由于所有实例都属于同一个驱动程序,因此它们都包含读取 proc 文件时将调用的函数(尽管该函数实际上仅由其中一个实例注册)。
我的问题是:当内核调用 read 函数时,它 总是 从创建 proc 文件的模块的地址 space 调用该函数,还是可以调用它来自另一个实例的地址 space?
您不能加载同一驱动程序的多个实例。第二次加载同一个驱动会因为驱动名称冲突而被拒绝
无法访问您的情况的另一个原因:使用与现有文件相对应的名称创建 proc 文件将失败。
更新(随着问题变得更加具体)
内核不检查从模块传递给它的地址。它只是使用这些地址,例如调用函数。
至于不同模块的地址space,所有模块与内核共享相同的地址space。因此,任何地址(例如 'proc' 文件的读取函数的地址)最多可能属于一个模块(或内核核心)。当模块加载到内核时,内核为其代码和静态数据分配内存。卸载模块时,内存及其代码和数据将被释放。
当同一驱动程序的多个实例同时 运行 时,我对 proc 文件的处理方式有疑问。 让我们假设我的系统同时运行同一个驱动程序的几个实例,但其中只有一个(根据一些内部决策)创建了一个 proc 文件并维护在读取文件时应该写入的信息。由于所有实例都属于同一个驱动程序,因此它们都包含读取 proc 文件时将调用的函数(尽管该函数实际上仅由其中一个实例注册)。 我的问题是:当内核调用 read 函数时,它 总是 从创建 proc 文件的模块的地址 space 调用该函数,还是可以调用它来自另一个实例的地址 space?
您不能加载同一驱动程序的多个实例。第二次加载同一个驱动会因为驱动名称冲突而被拒绝
无法访问您的情况的另一个原因:使用与现有文件相对应的名称创建 proc 文件将失败。
更新(随着问题变得更加具体)
内核不检查从模块传递给它的地址。它只是使用这些地址,例如调用函数。
至于不同模块的地址space,所有模块与内核共享相同的地址space。因此,任何地址(例如 'proc' 文件的读取函数的地址)最多可能属于一个模块(或内核核心)。当模块加载到内核时,内核为其代码和静态数据分配内存。卸载模块时,内存及其代码和数据将被释放。