6

I'm modifying the Linux kernel and am trying to find where in the kernel source blocks of data are physically written to disk partitions such as ubd0. Where does this occur in kernel source? The actual physical write call? I cannot find this. Thanks!

Edit: The end goal is a list of block numbers that have been written to a few different partitions. As data is physically written to the list, the block numbers written are returned and maintained.

4

3 回答 3

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

该函数中的生物结构,见此处: 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

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

于 2010-04-12T02:23:18.393 回答
0

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

编辑:

查看IO 调度程序代码。

于 2010-04-12T02:29:29.207 回答
0

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

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

于 2010-04-12T14:55:14.293 回答