Я изучаю главу 3.5 драйверов устройств , 3-е издание . Этот раздел вводит метод для получения пользовательской структуры, который мы определили от inode 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;
}
из моего понимания, в то время как устройство открывается, структура inode inode *
Представление устройства передается в SCALL_OPEN
. Затем пользовательская структура dev
извлекается и передается в Filp-> Private_data
, так что другие методы, такие как SCALL_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 */
}
Это выглядит нормально Для меня до тех пор, пока я понял, что у нас уже было struct Scull_dev * dev
во время инициализации в SCULL_SETUP_CDEV
здесь .
Я довольно путающуюся с тех пор, как я думал, что мы можем сделать struct Scull_dev * dev
глобальная переменная, затем SCALL_READ
и другие методы в конечном итоге будут иметь доступ к нему, не проходя через все Прохождение с использованием INODE
и файл
.
У меня вопрос, почему бы нам не сделать его глобальную переменную?
Может кто-нибудь дать некоторые практические примеры использования этого метода для передачи данных?