如何执行 I/O 以从 Linux 下的块设备驱动程序中阻止设备
How to performs I/O to block device from block device driver under Linux
我有一个任务是编写块设备驱动程序(/dev/dua - 例如),这个块设备必须看起来像 OS 作为磁盘设备 /dev/sda .所以,这个驱动程序必须处理数据块并将其写入其他块设备。
我正在寻找在后端设备上执行 I/O 操作的正确方法,例如“/dev/sdb”。
我玩过 vfs_read/write 例程,它对磁盘扇区大小的传输一目了然。但是,可能有更有效的方法在后端设备上执行 I/O ?
TIA。
以下一段代码(原文已在此处找到:https://github.com/asimkadav/block-filter)实现了一个"filtering"特性,因此它可以用作在后端执行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;
}
`
我有一个任务是编写块设备驱动程序(/dev/dua - 例如),这个块设备必须看起来像 OS 作为磁盘设备 /dev/sda .所以,这个驱动程序必须处理数据块并将其写入其他块设备。
我正在寻找在后端设备上执行 I/O 操作的正确方法,例如“/dev/sdb”。
我玩过 vfs_read/write 例程,它对磁盘扇区大小的传输一目了然。但是,可能有更有效的方法在后端设备上执行 I/O ?
TIA。
以下一段代码(原文已在此处找到:https://github.com/asimkadav/block-filter)实现了一个"filtering"特性,因此它可以用作在后端执行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;
}
`