- 论坛徽章:
- 0
|
本帖最后由 hackage 于 2010-12-11 21:11 编辑
回复 Godbach
不好意思,没说清楚。
我是要写程序,比如我现在知道主次设备号是 12345678 ...
527639827 发表于 2010-11-22 11:57
如果没有对应的设备结构指针 仅凭devno 貌似没有您需要的直接方式
对于字符设备 fs/char_dev.c 与之相近的是:- static struct char_device_struct {
- struct char_device_struct *next;
- unsigned int major;
- unsigned int baseminor;
- int minorct;
- char name[64];
- struct cdev *cdev; /* will die */
- } *chrdevs[CHRDEV_MAJOR_HASH_SIZE];
- /* index in the above */
- static inline int major_to_index(unsigned major)
- {
- return major % CHRDEV_MAJOR_HASH_SIZE;
- }
- #ifdef CONFIG_PROC_FS
- void chrdev_show(struct seq_file *f, off_t offset)
- {
- struct char_device_struct *cd;
- if (offset < CHRDEV_MAJOR_HASH_SIZE) {
- mutex_lock(&chrdevs_lock);
- for (cd = chrdevs[offset]; cd; cd = cd->next)
- seq_printf(f, "%3d %s\n", cd->major, cd->name);
- mutex_unlock(&chrdevs_lock);
- }
- }
- #endif /* CONFIG_PROC_FS */
复制代码 major_to_index()就是您要的 但符号没出来
chrdev_show()却一棒子把设备号和名字放进seq file的buffer
chrdev_show()就只在fs/proc/device.c中被调用 就是cat /proc/devices的效果:- static int devinfo_show(struct seq_file *f, void *v)
- {
- int i = *(loff_t *) v;
- if (i < CHRDEV_MAJOR_HASH_SIZE) {
- if (i == 0)
- seq_printf(f, "Character devices:\n");
- chrdev_show(f, i);
- }
- #ifdef CONFIG_BLOCK
- else {
- i -= CHRDEV_MAJOR_HASH_SIZE;
- if (i == 0)
- seq_printf(f, "\nBlock devices:\n");
- blkdev_show(f, i);
- }
- #endif
- return 0;
- }
复制代码 对于块设备 block/genhd.c 一样一样的:- static struct blk_major_name {
- struct blk_major_name *next;
- int major;
- char name[16];
- } *major_names[BLKDEV_MAJOR_HASH_SIZE];
- /* index in the above - for now: assume no multimajor ranges */
- static inline int major_to_index(unsigned major)
- {
- return major % BLKDEV_MAJOR_HASH_SIZE;
- }
- #ifdef CONFIG_PROC_FS
- void blkdev_show(struct seq_file *seqf, off_t offset)
- {
- struct blk_major_name *dp;
- if (offset < BLKDEV_MAJOR_HASH_SIZE) {
- mutex_lock(&block_class_lock);
- for (dp = major_names[offset]; dp; dp = dp->next)
- seq_printf(seqf, "%3d %s\n", dp->major, dp->name);
- mutex_unlock(&block_class_lock);
- }
- }
- #endif /* CONFIG_PROC_FS */
复制代码 而在fs/partitions/check.c:- const char *bdevname(struct block_device *bdev, char *buf)
- {
- return disk_name(bdev->bd_disk, bdev->bd_part->partno, buf);
- }
- EXPORT_SYMBOL(bdevname);
- /*
- * There's very little reason to use this, you should really
- * have a struct block_device just about everywhere and use
- * bdevname() instead.
- */
- const char *__bdevname(dev_t dev, char *buffer)
- {
- scnprintf(buffer, BDEVNAME_SIZE, "unknown-block(%u,%u)",
- MAJOR(dev), MINOR(dev));
- return buffer;
- }
- EXPORT_SYMBOL(__bdevname);
复制代码 __bdevname()也被写死了 仅被用在个别错误处理上
而bdevname()需要结构指针 |
|