Linux kernel Linux md驱动程序如何将数据写入SATA磁盘?

Linux kernel Linux md驱动程序如何将数据写入SATA磁盘?,linux-kernel,drivers,raid,Linux Kernel,Drivers,Raid,在这方面,它说: linux中的MD RAID是一个块驱动程序,用于在linux之间过滤数据 文件系统驱动程序,如ext2文件系统和底层硬盘 磁盘驱动程序,如AHCI驱动程序和SAS驱动程序 在内核代码drivers/md/md.c中,我只找到这个文件\u操作: static const struct file_operations md_seq_fops = { .owner = THIS_MODULE, .open = md_seq_op

在这方面,它说:

linux中的MD RAID是一个块驱动程序,用于在linux之间过滤数据 文件系统驱动程序,如ext2文件系统和底层硬盘 磁盘驱动程序,如AHCI驱动程序和SAS驱动程序

在内核代码
drivers/md/md.c
中,我只找到这个
文件\u操作

static const struct file_operations md_seq_fops = {
    .owner          = THIS_MODULE,
    .open           = md_seq_open,
    .read           = seq_read,
    .llseek         = seq_lseek,
    .release        = seq_release_private,
    .poll           = mdstat_poll,

};
md_fops既没有读也没有写:

static const struct block_device_operations md_fops =
{
        .owner          = THIS_MODULE,
        .open           = md_open,
        .release        = md_release,
        .ioctl          = md_ioctl,
#ifdef CONFIG_COMPAT
        .compat_ioctl   = md_compat_ioctl,
#endif
        .getgeo         = md_getgeo,
        .media_changed  = md_media_changed,
        .revalidate_disk= md_revalidate,
};
这是MD驱动程序执行的打开、读取…的文件操作吗。。。?MD驱动程序如何写入数据?使用AHCI驱动程序

调用write系统调用时,写入数据的步骤是什么


系统写入->vfs写入->文件->f操作->写入或同步写入?md_seq_fops既没有write也没有aio_write

结构文件操作
有更多的成员。根据C99,未列出的成员被初始化为
NULL
,这意味着它们不是专门实现的。这对于过滤器驱动程序是正常的;它们只替换一些操作。

函数调用的确切顺序将取决于各种情况,如I/O是直接的还是非直接的,I/O是同步的还是异步的等等。根据这些情况,在最后发出请求()调用MD层的方法,并在通过blk_queue_make_request()调用创建RAID设备时由MD层本身注册此方法,如MD.c文件中所示:

blk_queue_make_request(mddev->queue, md_make_request);
此md_make_request()函数将在内部调用特定于该RAID设备个性的make_request()方法,如下所示:

mddev->pers->make_request(mddev, bio);
您可以在源代码中各个RAID文件中给出的RAID个性化方法列表中找到特定的make_request()方法,即对于raid0 personality,以下是使用raid0.c文件中的raid0_make_request()初始化make_request()的方法列表

static struct md_personality raid0_personality=
{
         .name           = "raid0",
         .level          = 0,
         .owner          = THIS_MODULE,
         .make_request   = raid0_make_request,
         .run            = raid0_run,
         .free           = raid0_free,
         .status         = raid0_status,
         .size           = raid0_size,
         .takeover       = raid0_takeover,
         .quiesce        = raid0_quiesce,
         .congested      = raid0_congested,
};

此raid0\u make\u request()函数将在raid0设备上执行读写操作。

非常感谢。raid0\u发出请求->一般请求->q->发出请求(q,bio);正确的?如何请求调用AHCI驱动程序来写入数据?(假设sata驱动器连接到AHCI控制器)。@siyuan:是的。您提到的函数调用顺序是正确的。关于第二个问题,我主要研究SCSI或SCSI相关协议。我不确定AHCI,但是如果它的设备注册为SCSI设备,那么SCSI_request_fn->SCSI_dispatch_cmd,然后是AHCI驱动程序注册的queuecommand函数指针,我不确定,但可能是ata_SCSI_queuecmd()。但若它并没有通过SCSI路径,那个么您需要为AHCI驱动程序找到类似的流。MD raid是一个过滤器驱动程序吗?