Linux kernel Linux内核-内核中物理写入特定磁盘分区的数据块在哪里?

Linux kernel Linux内核-内核中物理写入特定磁盘分区的数据块在哪里?,linux-kernel,kernel,kernel-module,Linux Kernel,Kernel,Kernel Module,我正在修改Linux内核,并试图找到在内核中数据源块物理写入磁盘分区(如ubd0)的位置。这在内核源代码中的何处发生?实际的物理写调用?我找不到这个。谢谢 编辑:最终目标是已写入几个不同分区的块编号列表。当数据被物理写入列表时,写入的块号将被返回并维护。这取决于特定的驱动程序和设备类型。对于SCSI设备,SCSI命令转到设备驱动程序。它们在SCSI层生成,由设备的驱动程序发送到设备,然后发送到设备 在将数据推送到设备之前,sys_write系统调用有大量的抽象,而设备驱动程序本身甚至可能不知道它

我正在修改Linux内核,并试图找到在内核中数据源块物理写入磁盘分区(如ubd0)的位置。这在内核源代码中的何处发生?实际的物理写调用?我找不到这个。谢谢


编辑:最终目标是已写入几个不同分区的块编号列表。当数据被物理写入列表时,写入的块号将被返回并维护。

这取决于特定的驱动程序和设备类型。对于SCSI设备,SCSI命令转到设备驱动程序。它们在SCSI层生成,由设备的驱动程序发送到设备,然后发送到设备

在将数据推送到设备之前,sys_write系统调用有大量的抽象,而设备驱动程序本身甚至可能不知道它正在进行写入

对于您的编辑,请查看blktrace:

好的,另一个答案;你会更喜欢这个的。这发生在一般的_make_请求中。这些评论非常具有描述性:

该函数中的bio结构,如下所示:

显示bio_vec,这是设备的内容列表

q->提出请求(q,bio);是对设备本身的实际函数指针调用


显示如何使用索引写入分区。您应该注意,这不仅仅用于写入。

它在设备驱动程序中,通常通过DMA传输和中断信号I/O完成来完成。对于每个特定的硬件设备,这些是不同的。看看用一张简单的软盘会有多复杂

编辑:
查看代码。

如果你真的想从头开始发明这个特殊的轮子,我会点击请求队列函数。例如,要在请求进入队列时记录请求,可以将代码放入
submit\u bio()


我不确定排队出口的最佳位置。可能是旧内核上的
elv\u next\u request()
,或者是新内核上的
blk\u start\u request()

我认为我的问题措辞错误。最终目标是一个已写入几个不同分区的块编号列表。当数据以物理方式写入列表时,将返回并维护写入的块编号。我听说过blktrace,但需要以编程方式完成此操作,因为我需要自己处理列表并使用它。例如:当数据写入磁盘时,块号将由我的代码返回并保存在内存中。您应该更新您的问题,或者首先询问您真正想要的内容。我看到这是一个重复的是-blktrace被提到了那里,但不是我要找的,因此重新编写尝试,而不是让人们想到blktrace。谢谢WhirlWind。我将深入探讨这一点,并看看链接。这将是一个良好的起点。我会告诉你事情的进展。再次感谢@祝你好运。摆弄内核很有趣。