我正在修改Linux内核,并试图找到内核源数据块的哪些内容物理写入磁盘分区,如ubd0。这在核心源中发生了什么?实际的实际写入电话?我找不到这个。谢谢!
编辑:最终目标是已写入几个不同分区的块编号列表。当数据物理写入列表时,将返回并保留写入的块编号。
答案 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)
答案 2 :(得分:0)
如果你真的想从头开发这个特定的轮子,我会点击请求队列功能。例如,要在请求进入队列时记录请求,您可以将代码放入submit_bio()
。
我不确定挂钩队列出口的最佳位置。可能elv_next_request()
在较旧的内核上,或blk_start_request()
在较新的内核上。