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

时间:2010-04-12 02:16:42

标签: linux-kernel kernel kernel-module

我正在修改Linux内核,并试图找到内核源数据块的哪些内容物理写入磁盘分区,如ubd0。这在核心源中发生了什么?实际的实际写入电话?我找不到这个。谢谢!

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

3 个答案:

答案 0 :(得分:1)

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

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

要进行编辑,请查看blktrace: http://linux.die.net/man/8/blktrace

好的,另一个答案;你会更喜欢这个。这发生在generic_make_request中。评论非常具有描述性: http://lxr.linux.no/#linux+v2.6.32/block/blk-core.c#L1380

该函数中的bio结构,如下所示: http://lxr.linux.no/#linux+v2.6.32/include/linux/bio.h#L58

显示了bio_vec,它是进入设备的内容列表。

q-> make_request_fn(q,bio);是实际的函数指针调用到设备本身。

http://lxr.linux.no/#linux+v2.6.32/include/linux/types.h#L126

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

答案 1 :(得分:0)

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

编辑:

查看IO scheduler代码。

答案 2 :(得分:0)

如果你真的想从头开发这个特定的轮子,我会点击请求队列功能。例如,要在请求进入队列时记录请求,您可以将代码放入submit_bio()

我不确定挂钩队列出口的最佳位置。可能elv_next_request()在较旧的内核上,或blk_start_request()在较新的内核上。