Linux内核:如何从分区磁盘获取整个磁盘的dev_t?

时间:2015-11-30 07:21:13

标签: linux-device-driver device-driver procfs sysfs block-device

我希望检索整个磁盘的dev_t结构,给定磁盘上的分区。这适用于blkext驱动程序,例如nvme

类似的东西:

dev_t part_disk;
dev_t whole_disk = get_whole_disk_dev_t(part_disk);

我希望get_whole_disk_dev_t()的界面为:

参数:dev_t part_disk
返回:dev_t whole_disk

我建议的算法:

  1. dev_t获取分区磁盘的路径,即" / dev / nvme1n1p3"。我无法找到任何API来从dev_t获取路径。
  2. 执行一些字符串操作以删除" p3",为整个磁盘提供路径
  3. 将整个磁盘的path_name传递给blk_lookup_devt以获取整个磁盘的dev_twhole_disk=blk_lookup_devt(path_name,0)
  4. 这是正确的方法还是有更好的方法?如果是前者,那我怎样才能从dev_t获得路径?

    P.S:我需要在设备驱动程序中实现它(即在内核上下文中)。在用户空间中,我知道我可以使用udev API。

2 个答案:

答案 0 :(得分:1)

static int hello_init(void)

{

dev_t devno;

struct block_device *bddev;

struct gendisk *bddisk;

char disk_major[32];

devno=MKDEV(252,67);

printk(KERN_ALERT "Hello, world .... current devno is %x \n", devno);

bddev=bdget(devno);

if(bddev) {

    bddisk=bddev->bd_disk;

    if(bddisk) {

         strcpy(disk_major,bddisk->disk_name);

         printk(KERN_ALERT "bddisk is present %s", disk_major);

     } else {

       printk(KERN_ALERT "bddisk is not present");

    }

} else {

printk(KERN_ALERT "bdev failed ");

}

devno = blk_lookup_devt(disk_major,0);
printk(KERN_ALERT "after blk_lookup_dev:  dev_t: 0x%x  Major No %d   Minor No %d \n", devno, MAJOR(devno), MINOR(devno));

return 0;

}


static void hello_exit(void)
{

printk(KERN_ALERT "Goodbye, world\n");

}

答案 1 :(得分:0)

这不是问题:你可以读取/ proc / partitions文件,获取所需的sd [a | b | c] 驱动器ID。假设,那个id: char devId [] =“sdb” 之后调用devno = blk_lookup_devt(devId,0);