免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5281 | 回复: 5
打印 上一主题 下一主题

怎样根据主次设备号获取到设备的名字呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-22 08:38 |只看该作者 |倒序浏览
比如我现在已经知道设备的主次设备号,可是我还想知道设备在/dev/目录下面的名字,这个怎样才能获取到呢?

是否有什么系统调用函数可以获取到?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2010-11-22 10:18 |只看该作者
比如我现在已经知道设备的主次设备号,可是我还想知道设备在/dev/目录下面的名字,这个怎样才能获取到呢?


执行命令
# ls -l /dev/
输出结果的每一列你都知道是什么意思吗?

论坛徽章:
0
3 [报告]
发表于 2010-11-22 10:20 |只看该作者
设备在/dev/目录下面的名字


你说的是设备文件名吧,貌似不同的发行版处理的都不同,这个是用户空间的事情,不是内核要处理的,内核做出来的是sys文件系统下的东东。

论坛徽章:
0
4 [报告]
发表于 2010-11-22 11:57 |只看该作者
回复 2# Godbach


    不好意思,没说清楚。

   我是要写程序,比如我现在知道主次设备号是 12345678,

   那么我想有没有这样的一个函数,比如getDeviceName(dev_t devNo, char *devName)

   输入devNo,然后返回设备的名字,比如sda sdb啥的

   我就是想知道getDeviceName这个函数的名字在内核里面有没有?如果有,是什么呢?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2010-11-22 12:08 |只看该作者
既然设备都是注册到系统中的,那么系统中应该会有相关设备的全局列表,列表包含设备相关的信息。

因此,找到这个类型设备的全局列表,然后做一下查找,应该是可以找到的。

论坛徽章:
0
6 [报告]
发表于 2010-12-11 21:08 |只看该作者
本帖最后由 hackage 于 2010-12-11 21:11 编辑
回复  Godbach


    不好意思,没说清楚。

   我是要写程序,比如我现在知道主次设备号是 12345678 ...
527639827 发表于 2010-11-22 11:57

如果没有对应的设备结构指针 仅凭devno 貌似没有您需要的直接方式
对于字符设备 fs/char_dev.c 与之相近的是:
  1. static struct char_device_struct {
  2.         struct char_device_struct *next;
  3.         unsigned int major;
  4.         unsigned int baseminor;
  5.         int minorct;
  6.         char name[64];
  7.         struct cdev *cdev;                /* will die */
  8. } *chrdevs[CHRDEV_MAJOR_HASH_SIZE];

  9. /* index in the above */
  10. static inline int major_to_index(unsigned major)
  11. {
  12.         return major % CHRDEV_MAJOR_HASH_SIZE;
  13. }

  14. #ifdef CONFIG_PROC_FS
  15. void chrdev_show(struct seq_file *f, off_t offset)
  16. {
  17.         struct char_device_struct *cd;
  18.         if (offset < CHRDEV_MAJOR_HASH_SIZE) {
  19.                 mutex_lock(&chrdevs_lock);
  20.                 for (cd = chrdevs[offset]; cd; cd = cd->next)
  21.                         seq_printf(f, "%3d %s\n", cd->major, cd->name);
  22.                 mutex_unlock(&chrdevs_lock);
  23.         }
  24. }
  25. #endif /* CONFIG_PROC_FS */
复制代码
major_to_index()就是您要的 但符号没出来
chrdev_show()却一棒子把设备号和名字放进seq file的buffer
chrdev_show()就只在fs/proc/device.c中被调用 就是cat /proc/devices的效果:
  1. static int devinfo_show(struct seq_file *f, void *v)
  2. {
  3.         int i = *(loff_t *) v;
  4.         if (i < CHRDEV_MAJOR_HASH_SIZE) {
  5.                 if (i == 0)
  6.                         seq_printf(f, "Character devices:\n");
  7.                 chrdev_show(f, i);
  8.         }
  9. #ifdef CONFIG_BLOCK
  10.         else {
  11.                 i -= CHRDEV_MAJOR_HASH_SIZE;
  12.                 if (i == 0)
  13.                         seq_printf(f, "\nBlock devices:\n");
  14.                 blkdev_show(f, i);
  15.         }
  16. #endif
  17.         return 0;
  18. }
复制代码
对于块设备 block/genhd.c 一样一样的:
  1. static struct blk_major_name {
  2.         struct blk_major_name *next;
  3.         int major;
  4.         char name[16];
  5. } *major_names[BLKDEV_MAJOR_HASH_SIZE];

  6. /* index in the above - for now: assume no multimajor ranges */
  7. static inline int major_to_index(unsigned major)
  8. {
  9.         return major % BLKDEV_MAJOR_HASH_SIZE;
  10. }

  11. #ifdef CONFIG_PROC_FS
  12. void blkdev_show(struct seq_file *seqf, off_t offset)
  13. {
  14.         struct blk_major_name *dp;
  15.         if (offset < BLKDEV_MAJOR_HASH_SIZE) {
  16.                 mutex_lock(&block_class_lock);
  17.                 for (dp = major_names[offset]; dp; dp = dp->next)
  18.                         seq_printf(seqf, "%3d %s\n", dp->major, dp->name);
  19.                 mutex_unlock(&block_class_lock);
  20.         }
  21. }
  22. #endif /* CONFIG_PROC_FS */
复制代码
而在fs/partitions/check.c:
  1. const char *bdevname(struct block_device *bdev, char *buf)
  2. {
  3.         return disk_name(bdev->bd_disk, bdev->bd_part->partno, buf);
  4. }
  5. EXPORT_SYMBOL(bdevname);

  6. /*
  7. * There's very little reason to use this, you should really
  8. * have a struct block_device just about everywhere and use
  9. * bdevname() instead.
  10. */
  11. const char *__bdevname(dev_t dev, char *buffer)
  12. {
  13.         scnprintf(buffer, BDEVNAME_SIZE, "unknown-block(%u,%u)",
  14.                                 MAJOR(dev), MINOR(dev));
  15.         return buffer;
  16. }
  17. EXPORT_SYMBOL(__bdevname);
复制代码
__bdevname()也被写死了 仅被用在个别错误处理上
而bdevname()需要结构指针
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP