問題タブ [block-device]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - ブロックデバイス - 512 バイトの倍数でない場合、gendisk 構造を初期化します
現在、 Linux Device Drivers - 3rdを使用してカーネル ドライバーのプログラミングを学習しています。
ブロック デバイスを定義するには、gendisk
構造体を宣言し、関連情報で初期化する必要があります。
第16章には次のように書かれています。
セクター_t容量;
このドライブの容量 (512 バイト セクター)。Sector_t 型は 64 ビット幅にすることができます。ドライバーは、このフィールドを直接設定しないでください。代わりに、セクター数を set_capacity に渡します。
通常、次のような呼び出しを使用して容量を設定します。
512 バイトの倍数ではないメモリ ゾーンを持つデバイスがあるとします。
2000 バイトを取りましょう。3 つの 512 バイト ゾーンと 1 つの 464 バイト ゾーンがあります。
- 何に渡せば
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 の倍数でない場合に、ブロック デバイスを初期化する方法について質問を再開できますか?