問題タブ [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.
linux-kernel - Linux ブロック ドライバー マージの略歴
私は、ファッションの後、動作しているブロックデバイスドライバーを持っています。これは PCIe デバイス用であり、デバイスにはシーク時間がないため、要求キューを使用するのではなく、make_request_fn を使用して BIOS を直接処理しています。ただし、まだトランザクション オーバーヘッドがあります。
デバイスから連続して読み取ると、多くのセグメント (通常は最大 32) を持つ BIOS が取得され、それぞれが 2 つのハードウェア セクター (つまり 2 * 2k) で構成され、これがデバイスへの 1 つのスキャッター ギャザー トランザクションとして処理され、保存されます。多くのシグナリング オーバーヘッド。ただし、書き込みでは、BIOS にはそれぞれ 2 セクターのセグメントが 1 つしかないため、合計で操作にかなりの時間がかかります。私がやりたいことは、入ってくる BIOS を何らかの方法で多くのセグメントで構成するか、または自分で BIOS を適切にマージすることです。ここで正しいアプローチは何ですか?
の現在の内容は、次のmake_request_fn
ようなものです。
- バイオの読み取り/書き込みを決定する
- 略歴の各セグメントについて、
scatterlist*
with でエントリを作成しますsg_set_page
- このスキャッタリストを PCI にマッピングするには
pci_map_sg
- scatterlist 内のすべてのセグメントについて、複数セグメントの DMA スキャッター ギャザー操作を定義するデバイス固有の構造に追加します。
- その構造をDMAにマップする
- 取引を行う
- 構造と SG DMA のマップ解除
- 失敗した場合と成功
bio_endio
した場合に呼び出します。-EIO
0
リクエスト キューは次のように設定されます。
c - O_DIRECT で開かれたファイルに「書き込み」を行った後のユーザー バッファ
フラグを使用してO_DIRECT
、ユーザー バッファーから直接ディスクに書き込みます。しかし、私の知る限り、Linux はこの呼び出しの後にデータが書き込まれることを保証していません。DMA などを使用して、ユーザー バッファーから物理デバイスに直接書き込むだけです。したがって、「書き込み」関数の呼び出し後にユーザー バッファーに書き込めるかどうかわかりません。
サンプルコードが私の質問を理解するのに役立つと確信しています:
最後の行 (memset) は有効ですか? データをデバイスに転送するために DMA によって使用される可能性があるユーザー バッファへの書き込みは有効ですか?
linux-kernel - IO中のメディア削除後のブロックデバイスのクリーンアップ中のdel_gendiskhaging
ホットプラグ可能なPCIストレージデバイス用のブロックドライバーがあります。IO中にデバイスが削除された場合、リリースの呼び出し(つまり)が発生しないようです。これにより、完了mydev_blk_release(struct gendisk *gd, fmode_t mode)
が妨げられ、ドライバーのクリーンアップがハングします。del_gendisk()
イジェクトが発生したら、キュー上のすべてのリクエストを終了しますが、それでもリリースが発生しないようです。メディアが消えた場合にリクエストを終了してgendiskを削除する正しい方法は何ですか?
linux-kernel - blk_queue_segment_boundary() の使用法は何ですか
本 ldd は、関数 blk_queue_segment_boundary() について次のように述べています。
一部のデバイスは、特定のサイズのメモリ境界を超える要求を処理できません。あなたのデバイスがそれらのいずれかである場合、この関数を使用してカーネルにその境界について伝えます。たとえば、4 MB の境界を超える要求でデバイスに問題がある場合は、0x3fffff のマスクを渡します。デフォルトのマスクは 0xffffffff です。
ここで境界が何を意味するのかよくわかりません。たとえば、実際に 4MB のファイルで構成されている仮想ブロック デバイスがあるので、リクエストが 4MB の境界を超えないようにしたいのですが、
私が欲しいのは、 (file_offset + nbytes) が 4M を超えないことですが、実際には 4M を超えることもあるので、 blk_queue_segment_boundary() の誤解はありますか?
linux-kernel - Linuxカーネルのバイオ構造
私はRobertLoveによるLinuxカーネル開発を読んでいます。私は構造についてこの段落を理解していませんbio
:
カーネル内のブロックI/Oの基本的なコンテナは、で定義されているバイオ構造
<linux/bio.h>
です。この構造は、実行中(アクティブ)のブロックI/O操作をセグメントのリストとして表します。セグメントは、メモリ内で連続しているバッファのチャンクです。したがって、個々のバッファはメモリ内で連続している必要はありません。バッファをチャンクで記述できるようにすることで、バイオ構造は、カーネルがメモリ内の複数の場所から単一のバッファのブロックI/O操作を実行する機能を提供します。このようなベクトルI/Oは、スキャッターギャザーI/Oと呼ばれます。
- 正確にはどういう
flight(active)
意味ですか? - 「セグメントのリストとして」-このセグメンテーションについて話しているのですか?
- 「メモリ内のバッファを許可することによって」とはどういう意味ですか?
module - カーネル (3.7) モジュールから block_device を読み取る: submit_bio の segfault、bd_disk がありません
こんにちはスタックオーバーフローです。
カーネルモジュールからブロックデバイスに直接アクセスしようとして何が間違っていたのだろうか。(amd64 のカーネル 3.7)
get_gendisk() を使用してデバイスの (struct gendisk*) を取得します。次に、bio_map_kern() で bio を作成し、bdget_disk() を使用して block_device を追加し、submit_bio() を使用して送信します。(以下のコードを参照)
「sdb」でこれを行うと、正常に動作します。「loop0」または ramdisk デバイスで実行すると、segfault で失敗します。この障害は、generic_make_request_checks() がインライン関数 bdev_get_queue() を呼び出し、block_device 構造体の「bd_disk」フィールドにアクセスしようとしていることに要約されます。
RIP: 0010:[] [] generic_make_request_checks+0x3e/0x2b1
「sdb」から block_device を取得すると、bd_disk はデバイスの gendisk 構造体 (その任意のパーティション) にリンクされます。「loop0」デバイスで同じことを試みると、このポインターはゼロになります。しかし、mkfs、マウント、または dd を使用できるため、loop0 は適切にセットアップされています。
簡単なデータ読み取りを設定する方法に関するヒントはありますか? クリーンで適切な方法は?gendisk ポインターを block_device に追加することは、構造を「所有」していないため、良い解決策にはなりません。
たぶん、このアプローチはすべて間違っていて、見逃した簡単な read() 関数がいくつかあります... :-)
コールスタック (カーネル 3.7、amd64):
これを試すための私のテストコード:
macos - OSX ユーザー空間デバイス ファイル
サードパーティ ライブラリ (FUSE など) を使用せずに、OSX (10.8 以降) のユーザー空間を介してブロック デバイスを作成する方法はありますか?
ユーザー空間ツールを作成しようとしています。アイデアは、ユーザーがツールにファイルを提供し、ツールが仮想インターフェイスを作成するというものです。インターフェイスが書き込まれるたびに、ツールは操作をデータに適用してから、元のファイルに書き込みます。インターフェイスが読み取られるたびに、ツールは元のファイルから読み取り、逆の操作を適用します。
ブロックデバイスは必ずしも必要ではありません。ツールは、ファイルとして扱うことができるある種の仮想インターフェイスを作成する必要があります。つまり、別のアプリケーションで開いたり保存したりできます。
I/O Kit のユーザー空間ルーチンを調べましたが、仮想 USB/FireWire/MMC/SCSI デバイスを作成するのは過剰なようで、適用できるものはありませんでした。
device - /dev/input からライブ情報を取得する
これがこの質問の正しい場所かどうかはわかりません。システムのジョイスティックから軸位置の値を取得しようとして/dev/input/js0
います。実行jstest /dev/input/js0
すると、すべてのボタンと軸の位置に関するライブ フィードバックが返されます。
この情報を C プログラムに入力して、サーボを制御しようとしています。これを行うための機能はありますか?私はプログラミングで入力デバイスをあまり扱ったことがないので、これは私にとってすべて新しいことです。
cocoa - NSURL からブロック デバイスを取得する
質問はそれをすべて言います。たとえば、リムーバブル メディアを表す NSURL からブロック デバイスを取得するにはどうすればよいですか? 私が取得したいの/Volumes/MyDevice
は、のようなものです/dev/disk2
。IOKitフレームワークを使わずにそれができるのだろうか!どんな助けでも大歓迎です。
kernel - 「cat myfile > /dev/sda」と言うと、どのカーネル モジュール関数が呼び出されるか
Linux Kernel Module Programmingガイドをざっと読みましたが、わかりません:
と言うとcat image.iso > /dev/sda
、file_operations構造体write
の関数がデバイスドライバに実行されるのでしょうか?または、ファイル インターフェイスがブロック デバイス ノードに適用されていませんか?sda
その関数の実装はどこにありますか? ( Linux コード ツリー内のそれぞれのドライバー)?