Linux Kernel Module Programmingガイドをざっと読みましたが、わかりません:
と言うとcat image.iso > /dev/sda
、file_operations構造体write
の関数がデバイスドライバに実行されるのでしょうか?または、ファイル インターフェイスがブロック デバイス ノードに適用されていませんか?sda
その関数の実装はどこにありますか? ( Linux コード ツリー内のそれぞれのドライバー)?
Linux Kernel Module Programmingガイドをざっと読みましたが、わかりません:
と言うとcat image.iso > /dev/sda
、file_operations構造体write
の関数がデバイスドライバに実行されるのでしょうか?または、ファイル インターフェイスがブロック デバイス ノードに適用されていませんか?sda
その関数の実装はどこにありますか? ( Linux コード ツリー内のそれぞれのドライバー)?
fs/block-dev.c は、ブロック デバイスに適用可能なファイル操作とアドレス空間操作を定義します。
static const struct address_space_operations def_blk_aops = {
.readpage = blkdev_readpage,
.writepage = blkdev_writepage,
.write_begin = blkdev_write_begin,
.write_end = blkdev_write_end,
.writepages = generic_writepages,
.releasepage = blkdev_releasepage,
.direct_IO = blkdev_direct_IO,
.is_dirty_writeback = buffer_check_dirty_writeback,
};
const struct file_operations def_blk_fops = {
.open = blkdev_open,
.release = blkdev_close,
.llseek = block_llseek,
.read = do_sync_read,
.write = do_sync_write,
.aio_read = blkdev_aio_read,
.aio_write = blkdev_aio_write,
.mmap = generic_file_mmap,
.fsync = blkdev_fsync,
.unlocked_ioctl = block_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = compat_blkdev_ioctl,
#endif
.splice_read = generic_file_splice_read,
.splice_write = generic_file_splice_write,
};