我正在为Android内核编写驱动程序,该驱动程序需要打开并最终从MMC块设备读取(例如“/ dev / block / mmcblk0”)。现在我正在尝试使用blkdev_get_by_path()打开块设备,并计划通过为我的读取构建一个bio结构并使用generic_make_request()来执行读取来读取它。
此时我只是一步一步,只是尝试打开设备,然后在成功打开后关闭它(使用blkdev_put())。我面临的问题是即使只是调用blkdev_get_by_path()有时会导致内核崩溃并重启设备。
以下是一些代码:
#define MMC_DEV "/dev/block/mmcblk0"
void open_mmc_dev()
{
struct block_device *mmc_dev;
mmc_dev = blkdev_get_by_path(MMC_DEV, FMODE_READ, 0);
if (!IS_ERR(mmc_dev))
{
blk_dev_put(mmc_dev);
printk("Opened MMC Device\n");
}
else
{
printk("blkdev_get_by_path failed with %ld\n", PTR_ERR(blk_dev));
}
}
我还应该补充一点,这个用于打开MMC设备的代码是通过使用mod_timer()调度事件来重复运行的,最初是在我自己的驱动程序的init函数中安排的。原因是MMC设备最初不存在,所以我将此事件设置为每100ms运行一次。只要blkdev_get_by_path()返回-ENOENT,我重置我的事件就会在100ms之后再次运行,直到我成功获得block_device指针。我所看到的是,每3或4个靴子中有1个将挂起电话或导致它重新启动。在成功启动时,我能够用dmesg验证我最终能够获得指向MMC block_device的指针。我也尝试重复运行我的事件而不调用blkdev_get_by_path()和blkdev_put(),这不会导致我看到的崩溃,所以崩溃似乎与那些blkdev调用有关。
什么可能导致blkdev_get_by_path()崩溃? 打开像这样的块设备是否需要一些同步组件?