如何在Linux下执行I / O以阻止来自块设备驱动程序的设备

问题描述 投票:0回答:1

我有一个编写块设备驱动程序的任务(例如/ dev / dua),这个块设备必须看起来像OS这样的磁盘设备,如/ dev / sda。因此,此驱动程序必须处理数据块并将其写入其他块设备。

我正在寻找一种在后端设备上执行I / O操作的正确方法,如“/ dev / sdb”。

我已经使用了vfs_read / write例程,它可以一目了然地进行磁盘扇区大小的传输。但是,可能有更有效的方法在后端设备上执行I / O?

TIA。

linux-device-driver
1个回答
1
投票

遵循一段代码(原文在这里找到:https://github.com/asimkadav/block-filter)实现了“过滤”功能,因此它可以用作在后端块设备上执行I / O的方法。

void misc_request_fn(struct request_queue *q, struct bio *bio) {
        printk ("we are passing bios.\n");
        // here is where we trace requests...
        original_request_fn (q, bio);
        return;
}


void register_block_device(char *path)  {

        struct request_queue *blkdev_queue = NULL;

        if (path == NULL)       {
                printk ("Block device empty.\n");
                return;
        }

        printk ("Will open %s.\n", path);

        blkdev = lookup_bdev(path);

        if (IS_ERR(blkdev))     {
                printk ("No such block device.\n");
                return;
        }

        printk ("Found block device %p with bs %d.\n", blkdev, blkdev->bd_block_size);
        blkdev_queue = bdev_get_queue(blkdev);
        original_request_fn = blkdev_queue->request_fn;
        blkdev_queue->request_fn = misc_request_fn;
}

`

© www.soinside.com 2019 - 2024. All rights reserved.