Я изучаю главу 3.5 драйверов устройств Linux, 3-е издание. В этом разделе представлен метод извлечения пользовательской структуры, которую мы определили из struct inode *inode в открытой функции:
int scull_open(struct inode *inode, struct file *filp)
{
struct scull_dev *dev;
dev = container_of(inode->i_cdev, struct scull_dev, cdev);
filp->private_data = dev; /* for other methods */
}
return 0;
}
По моему мнению, пока устройство открыто, struct inode *inode, представляющее устройство, передается на scull_open. Затем пользовательская структура dev извлекается и передается в filp->private_data, так что другие методы, такие как scull_read, могут использовать ее:
ssize_t scull_read(struct file *filp, char _ _user *buf, size_t count,
loff_t *f_pos)
{
struct scull_dev *dev = filp->private_data;
/* other codes that uses *dev */
}
Мне это кажется прекрасным, пока я не понял, что во время инициализации в scull_setup_cdev здесь уже был struct scull_dev *dev.
Я довольно смущен, так как я думал, что мы можем сделать struct scull_dev *dev глобальную переменную, тогда scull_read и другие методы в конечном итоге будут иметь к ней доступ, не пройдя все прохождение с помощью inode и file.
Мой вопрос: почему бы нам просто не сделать глобальную переменную?
Может ли кто-нибудь предоставить некоторые практические примеры использования этого метода для передачи данных?