Я изучаю главу 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
.
Мой вопрос: почему бы нам просто не сделать глобальную переменную?
Может ли кто-нибудь предоставить некоторые практические примеры использования этого метода для передачи данных?