struct file_operations
{
.open
}
function.並且把 開啟時的參數 (major, minor number) 放在 struct inode 的
include/linux/fs.h
struct inode {
...
dev_t i_rdev;
...
}
中dev_t 定義在
include/linux/types.h
typedef __u32 __kernel_dev_t;
typedef __kernel_dev_t dev_t;
這個 dev_t (i_rdev) 包含 major, minor number,用以下的 MACRO 取出:
include\linux\kdrv_t.h
#define MINORBITS 20
#define MINORMASD ((1U << MINORBITS) -1 )
#define MAJOR(dev) ((unsigned int)((dev) >> MINORBITS)
#define MINOR(dev) ((unsigned int)((dev) & MINORMASK))
所以 driver 可以靠 參數的 inode.i_rdev 知道 user program 是對哪一個 minor number 動作。
driver 的 read/write function 沒有 inode 參數,而是用 struct file *filep
同樣的
filep->f_dentry->d_inode->i_rdev 可以拿到 dev_t i_rdev
所以linux 的 dev node 最多只有 32-20 = 12 bits (4096).
每個 device 最多有 20 = 1048576 個 minor number
可以用
沒有留言:
張貼留言