29

C プログラムからハードディスク全体に直接アクセスしたい。FS はありませんし、FS になることもありません。

/dev/sda (たとえば) を開き、ディスクのブロック/セクター レベルで I/O を実行したいだけです。

Linux 環境 (C 言語、Python、Perl、Java は知っています) で C プログラミングを学習するためのプログラムをいくつか作成する予定ですが、Linux 環境に自信がありません。

私の学習目的のために、京都キャビネットで遊んで、計算されたハッシュに対応する値をハードディスクの「ブロック/セクター」に直接保存し、「ハッシュ、ブロック/セクター参照」のペアを記録することを考えていますkyoto-cabinet ハッシュ データベース ファイル。

これが標準の CI/O 関数を使用して実現可能かどうかはわかりません。それ以外の場合は、「デバイス ドライバー」などを作成する必要があります...

4

3 に答える 3

29

他の場所で述べたように、*NIX システムでは、ブロック デバイスなど/dev/sdaはプレーン ファイルとしてアクセスできます。ファイル システムがデバイスからマウントされている場合、書き込み用のファイルとして開くことはできません。

ブロック デバイスで遊びたい場合は、まずloop deviceプレーン ファイルをブロック デバイスとして表示する を使用することをお勧めします。例えば:

dd if=/dev/zero of=./loop_file_10MB bs=1024 count=10K
losetup /dev/loop0 $PWD/loop_file_10MB

その後/dev/loop0、ブロック デバイスであるかのように動作しますが、書き込まれたすべての情報はファイルに保存されます。

于 2010-08-19T10:07:35.693 に答える
11

ドライブのデバイス ファイル (例: /dev/sda) はブロック デバイスであるため、通常のファイルとほとんど同じように、ファイルを開いたり、検索したり、使用したりできます。

于 2010-08-19T09:41:12.230 に答える
8

はい、他の人が指摘したように、ブロックデバイスを開くだけです。

ただし、ブロック境界とブロック全体で IO (とにかく書き込み) を実行することをお勧めします。pread() や pwrite() などを使用して、これらの IO を実行したり、デバイスの一部またはすべてを mmap したりできます。

使用できる ioctl がたくさんあります。詳細については、「man sd」を参照してください。それらはすべて同じ場所に文書化されているわけではないようです。

linux/fs.h には BLKROSET とその他の ioctl が定義されているため、それらの使用方法を見つけるには周りを見回す必要があります。デバイスの大きさやブロックサイズを調べるなどの便利なことができます。

util-linux-ng パッケージのソース コードは参考になります。サンプルが含まれています。

于 2010-08-19T16:36:59.900 に答える