問題タブ [sector]
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 の倍数でない場合に、ブロック デバイスを初期化する方法について質問を再開できますか?
winapi - CD-ROM の正確なトラック長を計算するために前後のギャップをどのように検出しますか?
を使用してIOCTL_CDROM_READ_TOC_EX
、CD-ROM トラックの正確な長さを計算する単純な方法は、オーディオ トラックには 2 秒のプリギャップがあり、別のトラック タイプが続くデータ トラックには 2 秒のポスト ギャップがあると仮定することです。
しかし、残念なことに、マルチセッション ディスクなど、常にそうであるとは限りません。
そこで、各トラックの正確な長さを計算するために次のことを思いつきました。
- トラックの先頭を逆方向に読み取る
- コマンドを発行して
READ CD
Q サブチャネルを読み取る INDEX
電流がゼロである限り、TNO
事実上、ギャップ前後のゾーンにいます。
これは期待どおりに機能し、ギャップを見つけてセクター単位の正確なトラック長を計算できます。
しかし、このトピックが SCSI マルチメディア コマンド仕様で説明されていないのは少し驚くべきことです!
質問:
これは、CD-ROM の各トラックの正確な長さを計算する正しい方法ですか?