Я изучаю главу 3.5 из Драйверы устройств Linux, 3-е издание . В этом разделе описывается метод извлечения пользовательской структуры, которую мы сами определили из struct inode *inode
в функции open:
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 */
}
Мне кажется, что это нормально, пока я не понял, что у нас уже есть struct scull_dev *dev
во время инициализации в scull_setup_cdev
здесь .
Я немного сбит с толку, так как думал, что мы можем сделать struct scull_dev *dev
глобальной переменной, тогда scull_read
и другие методы в конечном итоге получат доступ к ней, не пройдя весь проход с использованием inode
и file
.
Мой вопрос: почему бы нам не сделать это глобальной переменной?
Кто-нибудь может привести некоторые практические примеры использования этого метода для передачи данных?