0

現在、 Linux Device Drivers - 3rdを使用してカーネル ドライバーのプログラミングを学習しています。

ブロック デバイスを定義するには、gendisk構造体を宣言し、関連情報で初期化する必要があります。

第16章には次のように書かれています。

セクター_t容量;

このドライブの容量 (512 バイト セクター)。Sector_t 型は 64 ビット幅にすることができます。ドライバーは、このフィールドを直接設定しないでください。代わりに、セクター数を set_capacity に渡します。

通常、次のような呼び出しを使用して容量を設定します。

set_capacity(gendisk, sector_number*(hard_sector_size/KERNEL_SECTOR_SIZE));

512 バイトの倍数ではないメモリ ゾーンを持つデバイスがあるとします。

2000 バイトを取りましょう。3 つの 512 バイト ゾーンと 1 つの 464 バイト ゾーンがあります。

[-512b-]      [-512b-]      [-512b-]      [-464b-]
0     511    512    1023   1024   1535   1536   1999
  • 何に渡せばset_capacityいいですか?

さらに、一部のデバイスでは、メモリが複数の領域に分割されています。それぞれが異なるサイズの複数のメモリ領域を含むデバイスがあり、この分割されたメモリを 1 つのメモリ ゾーンに抽象化したいとします。

area1 = > 32000 バイト
area2 => 512 バイト
area3 => 50 バイト
area4 => 45 バイト
area5 => 1024 バイト

この場合、ハード セクタ サイズはデバイス内で一定ではありません。

  • 構造をどのように埋める必要がありgendiskますか?

@KamilCukの回答後の更新:

この例を続けるために、512 バイトの 65 セクタ + 351 バイトの 1 セクタである完全なデバイス メモリ (33631 バイト) を考えてみましょう。

したがって、解決策は次のいずれかとして提示することです。

  • 33270 バイトのメモリ ゾーン ==> 65 セクタ

また

  • 33631 バイトのメモリ ゾーン ==> 最後のセクタの最後で 161 バイトが破棄される 66 セクタ

これらは最善の解決策ですか、それともこの特定のケースを処理する別の方法がありますか?


  • 基本的に、ブロック デバイスが KERNEL_SECTOR_SIZE の倍数でない場合に、ブロック デバイスを初期化する方法について質問を再開できますか?
4

1 に答える 1