【问题标题】:Linux Kernel - Where in the kernel are blocks of data physically written to specific disk partitions?Linux 内核 - 内核中的哪些数据块是物理写入特定磁盘分区的?
【发布时间】:2010-04-13 11:19:57
【问题描述】:

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

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

【问题讨论】:

标签: linux-kernel kernel kernel-module


【解决方案1】:

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

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

对于您的编辑,请查看 blktrace: http://linux.die.net/man/8/blktrace

好的,另一个答案;你会更喜欢这个的。这发生在 generic_make_request 中。 cmets 非常具有描述性: 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

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

【讨论】:

  • 感谢旋风。我将深入研究并查看链接。这将是一个很好的起点。我会让你知道情况如何。再次感谢!
  • @SpdStr 祝你好运。内核摆弄很有趣。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    编辑:

    查看IO scheduler 代码。

    【讨论】:

    • 我认为我的问题措辞有误。最终目标是已写入几个不同分区的块号列表。当数据被物理写入列表时,写入的块号被返回并维护。我听说过 blktrace,但需要以编程方式完成,因为我需要自己处理列表并使用它。
    • 示例:当数据写入磁盘时,我的代码将返回块号并将其保存在内存中。
    • 您应该更新您的问题,或者首先询问您真正想要的内容。
    猜你喜欢
    • 1970-01-01
    • 2014-04-17
    • 2021-07-20
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    相关资源
    最近更新 更多