beyes@linux-beyes:~/C/kernel/memory> ll /dev |more
总计 0
crw-rw---- 1 root uucp 4, 70 04-14 18:16 ttyS6
crw-rw---- 1 root uucp 4, 71 04-14 18:16 ttyS7
crw-rw---- 1 root tty 7, 0 08-08 18:58 vcs
crw-rw---- 1 root tty 7, 1 08-08 18:58 vcs1
crw-rw-rw- 1 root root 1, 7 08-08 18:58 full
crw-rw-rw- 1 root root 1, 3 04-14 18:16 null
typedef __kernel_dev_t dev_t;
typedef int __kernel_key_t;
MAJOR (dev_t dev);
MINOR (dev_t dev);
#define MINORBITS 20
#define MINORMASK ((1U << MINORBITS) - 1)
#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
MKDEV(int major, int minor);
#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))
int register_chrdev_region(dev_t first, unsigned int count, const char *name);
brw-rw---- 1 root disk 8, 16 2009-09-24 sdb
brw-rw---- 1 root disk 8, 17 2009-09-24 sdb1
brw-rw---- 1 root disk 8, 18 2009-09-24 sdb2
brw-rw---- 1 root disk 8, 21 2009-09-24 sdb5
brw-rw---- 1 root disk 8, 22 2009-09-24 sdb6
brw-rw---- 1 root disk 8, 23 2009-09-24 sdb7
brw-rw---- 1 root disk 8, 24 2009-09-24 sdb8
struct file operations minor0_fops = {
/* 次设备号为 1 时,处理的 file_operations */
... ....
}
struct file operations minor1_fops = {
/*次设备号为 2 时,处理的 file_operations */
... ....
}
int minor_open (struct inode *inode, struct file *filp)
{
switch (MINOR (inode->i_rdev)) {
case 1:
filp->f_op = &minor0_fops;
break;
case 2:
filp->f_op = &minor1_fops;
break;
... ...
default:
return -ENXIO;
}
if (filp->f_op && filp->f_op->open)
return filp->f_op->open (inode, filp); /* 运行与实际次设备号相匹配的 open() 函数 */
return 0;
}
struct file_operations master_fops = {
.open = minor_open,
};
int xxx_init (void)
{
int result;
result = register_chrdev (MINOR_DEV_MAJOR, MINOR_DEV_NAME, &master_fops);
}
switch (MINOR (inode->i_rdev)) { case 1: filp->f_op = &minor0_fops; break; case 2: filp->f_op = &minor1_fops; break; ... ... default: return -ENXIO; } |
if (filp->f_op && filp->f_op->open)
return filp->f_op->open (inode, filp);
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) | Powered by Discuz! X3.2 |