0

LinuxカーネルAPIには__breadメソッドがあります。

__bread(struct block_device *bdev, sector_t block, unsigned size)

これは、データフィールドにサイズに相当するデータが含まれるbuffer_headポインターを返します。ただし、 sizeバイトを超えて読み取ると、PAGE_SIZEバイト数までの有効なデータが得られることに気付きました。これにより、* __ bread *によって返されるbuffer_headには、渡されるsize引数が小さくても、常にPAGE_SIZEバイトに相当する有効なデータが含まれていると推測できるかどうか疑問に思いました。

あるいは、それは単なる偶然だったのかもしれません。

4

1 に答える 1

1

__breadは、指定されたブロックインターフェイスから読み取りIOを実行しますが、バッキングストアに応じて、異なる結果が得られます。

ハードドライブの場合、ブロックデバイスはセクターサイズのデータ​​をフェッチします。通常、これは512バイトまたは4Kのいずれかです。512バイトで、256バイトを要求すると、セクターの最後の部分にアクセスできるようになります。したがって、セクターサイズまでフェッチできます。ただし、常に正しいとは限りません。メモリでバックアップされたデバイスでは、256バイトにしかアクセスできません。これは、ブロックレイヤーではなく、VSLによって提供されるためです。

要するに、違います。この機能は、ストレージをバックアップしているブロックデバイスに依存し、ブロックレイヤーの実装によっても変わる可能性があるため、この機能に依存しないでください。

于 2012-08-02T21:45:39.700 に答える