Linux kernel 为什么';dd';具有不同bs(块大小)的命令不';不影响BIU尺寸?

Linux kernel 为什么';dd';具有不同bs(块大小)的命令不';不影响BIU尺寸?,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我正在测试一个块设备驱动程序 当我对不同的bs块大小使用'dd'命令时,“bio”结构中的bi_size字段似乎没有改变。它保持在4KB 我做错了什么 顺便说一句,我正在运行直接输出到我的设备(of=/dev/xxx)的'dd',而不是通过VFS。似乎4KB是块设备的扇区大小,所以对它的所有请求都与该值对齐 从 一旦完成,内核将遵循设备的硬件扇区大小。所有I/O请求都在硬件扇区的开头正确对齐,每个请求的长度是扇区的整数 请注意,通过在块设备文件(of=/dev/xxx)上使用dd,实际上可以通过

我正在测试一个块设备驱动程序

当我对不同的bs块大小使用'dd'命令时,“bio”结构中的bi_size字段似乎没有改变。它保持在4KB

我做错了什么


顺便说一句,我正在运行直接输出到我的设备(of=/dev/xxx)的'dd',而不是通过VFS。

似乎4KB是块设备的扇区大小,所以对它的所有请求都与该值对齐

一旦完成,内核将遵循设备的硬件扇区大小。所有I/O请求都在硬件扇区的开头正确对齐,每个请求的长度是扇区的整数


请注意,通过在块设备文件(of=/dev/xxx)上使用
dd
,实际上可以通过VFS。块设备的接口不同于一个文件,因此代表块设备的文件上的操作(例如读/写)是块设备操作的包装。(此外,对任何文件的任何访问都要通过VFS。)

似乎4KB是块设备的扇区大小,因此对它的所有请求都是按该值对齐的

一旦完成,内核将遵循设备的硬件扇区大小。所有I/O请求都在硬件扇区的开头正确对齐,每个请求的长度是扇区的整数


请注意,通过在块设备文件(of=/dev/xxx)上使用
dd
,实际上可以通过VFS。块设备的接口不同于一个文件,因此代表块设备的文件上的操作(例如读/写)是块设备操作的包装。(此外,对任何文件的任何访问都要通过VFS。)

dd
读取和写入文件时,
dd
的块大小就是使用的块大小。内核不需要使用与请求写入该大小的用户空间进程相同的块大小(或同时)写入设备。内核为VFS操作提供了缓冲(并且还维护了一定的块大小写入是原子的,即4KB IIRC)。顺便说一句,
/dev/
块设备确实通过VFS(块大小不受您控制的事实应该足以证明这一点)


因此,是的,
dd
中的
bs
选项不会影响内核在实际序列化写入设备时使用的块大小。

dd的块大小只是
dd
读取和写入文件时使用的块大小。内核不需要使用与请求写入该大小的用户空间进程相同的块大小(或同时)写入设备。内核为VFS操作提供了缓冲(并且还维护了一定的块大小写入是原子的,即4KB IIRC)。顺便说一句,
/dev/
块设备确实通过VFS(块大小不受您控制的事实应该足以证明这一点)


因此,是的,
dd
中的
bs
选项不会影响内核在实际序列化写入设备时使用的块大小。

感谢您的评论。我同意你指出的,它仍然通过VFS。我相信bi_size是请求的扇区数。我期望它不仅仅是1。我只看到很多bio请求,都是顺序的,BIU大小为1块4KB。如果我使用fdisk并装载设备,然后在装载点对文件执行“dd”,那么我会看到bi_大小与bs参数匹配。再次感谢。谢谢你的评论。我同意你指出的,它仍然通过VFS。我相信bi_size是请求的扇区数。我期望它不仅仅是1。我只看到很多bio请求,都是顺序的,BIU大小为1块4KB。如果我使用fdisk并装载设备,然后在装载点对文件执行“dd”,那么我会看到bi_大小与bs参数匹配。再次感谢。感谢您提供更多的见解。关于如何控制VFS发送给我的设备驱动程序的BIU大小,您有什么建议吗?我希望它比4K大得多。我在/sys/block//queue中使用了一些值,这有一定的效果,但只有通过mkfs才能实现。我正在学习编写一个块设备驱动程序,希望能够控制测试。我想测试特定的bi_大小,而不仅仅是让文件系统给我各种大小。再次感谢您的回复!感谢您提供更多的见解。关于如何控制VFS发送给我的设备驱动程序的BIU大小,您有什么建议吗?我希望它比4K大得多。我在/sys/block//queue中使用了一些值,这有一定的效果,但只有通过mkfs才能实现。我正在学习编写一个块设备驱动程序,希望能够控制测试。我想测试特定的bi_大小,而不仅仅是让文件系统给我各种大小。再次感谢您的回复!