0%

Linux 学习 QA


  Q1、为什么在驱动文件中,fops 中的 open 函数要将 filp 的 private_data 指向设备地址,read 函数再从 private_data 获取设备信息,而不是直接访问呢?
  第一、驱动可能不止一个设备实例,一个驱动可能会支持多个设备,如果 read() 里直接访问全局变量,你根本不知道打开的是哪一个设备。而在 open 时内核已经通过 inode 知道设备号,可以在 open 找到对应设备结构体存到 private_data ,之后read、write 都可以拿到正确设备。
  第二、一个设备可以被多个进程打开。在多个线程同时访问同一设备时,内核会创建多个不同的 struct file,每个现成的 fop 独立,不能互相访问。


  Q2、为什么在驱动文件中,设备结构体的类和设备结构体要设置为指针?
  因为这些对象不是驱动程序创建的,而是内核创建的。驱动只是登记了一个设备类和设备节点,真正的对象是在内核设备模型里分配的,设备对象必须由内核统一管理,而不是驱动自己随便创建或释放。