4

C プログラミング言語を使用して HDD の任意のブロックに書き込むにはどうすればよいですか?

MBRの書き方について質問がありましたが、C の側面はあまりカバーされていませんでした。

filedescriptors は、その言葉が示すように、ファイル用であるため、この場合、それらを使用する方法はないと思います。C 標準ライブラリに含まれる低レベル I/Oも、ファイル記述子で実装されています。

より正確に言えば、
この質問は、ファイルよりも HDD ブロックの書き込みに関するものです (OS に依存しません)。

上記の質問に対する回答は、基本的に UNIX システムでdd (coreutils) を使用することを提案していました。これが、私が C での方法を求めている理由です。ブートローダー ( GRUB ) とブート セクター ウイルスは異なる手法を使用しているのではないでしょうか?

ファイル記述子内の実際のポインターを変更することは、正当な方法ではないと思います。

問題と制限:
心に留めておくべき特定の側面があることを知っています。

  • 一部のオペレーティング システムでは、ボリュームへの直接アクセスが制限されています (Windows など)。
  • 書き込みエラーや特定のブロックへの間違ったデータの書き込みは、ファイルシステムの破損 (HDD 上のデータの損失) につながる可能性があります。
  • ウイルス対策ソフトウェアは、疑わしいコードとしてフラグを立てる可能性があります。

この質問は、より理論的なものです。

4

5 に答える 5

5

C言語は、関数などを含むファイルにアクセスできます。しかし、言語にはブロックデバイスfopen/fclose/fread/fwriteのようなものはありません(デバイスでさえありません)。

一方、POSIXには、open/close/read/writeファイルにアクセスするための低レベルの機能があり、ブロックデバイスの概念があります。これらの関数は、いくつかの単純なルール (主にブロックのアライメント) に従い、デバイスの名前 ( ) を知っている限り、(注意して) ブロック デバイスに使用でき/dev/xxxます。

Windows などの非 POSIX システムを使用している場合、OS にはブロック デバイス アクセスを処理するための特定の方法があります。たとえば、Windows では、このCreateFile関数をデバイス名など\\.\PhysicalDrive0で使用できます\\.\C:

于 2011-12-28T11:54:41.450 に答える
1

Unix ライクなオペレーティング システムの場合、これは問題ではありません。ハードディスクは、他のファイルと同じようにデバイス ファイルであり、他のファイルと同じようにアクセスされます。ファイル記述子を取得し、シークし、書き込み、ファイルシステムをクラッシュさせれば、すべて問題ありません。

これは、C でも通常のファイル I/O ルーチンを使用する必要があることを意味します。高レベルの I/O と低レベルの I/O を区別するのはあなたの仕事ではなく、オペレーティング システムの仕事です。現在、ほとんどのオペレーティング システムはファイルとしてのデバイス メタファをサポートしているため、C ではそれ以上の抽象化は行われていません。このアプローチは DOS および派生物では機能しない可能性がありますが、これは古いコードの維持を避けるために DOS を避ける理由にすぎません。

于 2011-12-28T11:47:14.537 に答える
1

OSに依存しないようにしたい場合は、おそらく何らかのポリモーフィズムを使用したいと思うでしょう。次に、必要な機能をサポートする構造を作成できます。

コードがOSを移動したときに変更できるポインタへの関数を含む構造を作成する場所。次に、サポートする OS ごとに OS ベースの実装が必要になります。

于 2011-12-28T12:01:22.947 に答える
0

これは、C とはほとんど関係がありません。ハードウェアの一部にプログラムでアクセスする方法は、CPU がそのデバイスとどのように通信できるか (つまり、システム/ハードウェア アーキテクチャ/設計) に依存し、OS が関与している場合は、 OS は、その中で実行されている他のソフトウェアがデバイスにアクセスできるようにします (存在する場合)。

x86 PC では、OS が実行されていない場合、BIOS 割り込み 13h 関数を使用して HDD セクターの読み取りと書き込みを行うことができます。BIOS を使用せずに、既知の I/O ポートと ATA(PI) コマンドを使用して同じことを行うことができます。DOS があればほぼ同じで、ハードウェア アクセスに制限はありません。Windows や Linux の場合、十分な権限を持っているか、特定の方法で操作しない限り、OS はこの種の操作を許可しません。

于 2011-12-28T12:01:12.150 に答える
-1

open() close() read() write() は C 言語の一部ではなく、OS の一部です。

さらに、 write() は何も書き込みません。これは、OS に書き込みを要求するシステムコールです。OS は、この要求に対して必要なことを何でも実行できます (無視するなど)。

/dev/* エントリは、マシンのプライベート パーツへの単なるフックであり、他の方法では実行できないことを実行できるようにするために OS によって提供されます。しかし、/dev/disk デバイスの 1 つを open() および write() すると、OS にはまだ要求を無視する力があります。

于 2011-12-28T12:02:05.537 に答える