ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2011年7月26日 星期二

linux device open, major/minor number

device 被 open 的時候, kernel 會 call driver 的 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
可以用

沒有留言:

標籤

網誌存檔