ファームウェアのコードかデータか

ファームウェアをデバイスに「フラッシュ」したと誰かが言ったとき、これが実際に何を意味するのかについて興味があります。

  1. ファームウェアは、メモリに格納されていて、デバイスのCPUで解釈できる(コンピュータ上の他のEXEファイルと同じように)ネイティブバイナリにすぎませんか。それともファームウェアは、不変プログラムへの入力として機能するデータに過ぎず、すでにデバイスにハードコード/配線されていますか。
  2. 後者の例がファームウェアではない場合、どうしますか。たとえば、デバイスにバイナリ( someapp.exe )が含まれているとします。このバイナリを削除または変更することはできません。バイナリが実行されると、メモリチップから入力を受け取ります。このチップにデータを「フラッシュ」することができます。そのため、次回の実行時に有効になる someapp.exe の入力/設定に影響します。ファームウェアでなければ、これは何と呼ばれますか。
29
CPUは、ハードウェアに書き込まれて、何をすべきかを指示するデータを読み取る不変プログラムです。
追加された 著者 ray,
本は言葉ですか、それとも文字ですか。
追加された 著者 Hrvoje Hudo,
さて、この問題はそれほど大きな欠陥ではないとしても 良いでしょう。コードはデータであり、データはコードでも構いませんフォンノイマン建築/モデルが関係しています。したがって、コード全体をデータとして扱うことができ(また、通常)、その逆も同様です。また、OPへ: en.wikipedia.org/wiki/Firmware を確認しないでください。この質問、そしてファームウェアに関する他の多くの質問に対する答えを持っています。したがって、「12Vの電球を230Vのソケットに差し込むことはできますか」という質問から抜け出していますが、それでもまだ不十分です。私の本に-par ...
追加された 著者 Christian,
@ChristopherCreutzigはい、彼らは一般的にRISC&Harvardアーキテクチャを使用しています - そのため is is として扱うことができます;例えばを使用してからブートローダはコードとデータの分離を簡単に融合します。コードはまだデータであり、メモリバスではなく命令パイプラインの異なるバスを介してアクセスされるだけです。
追加された 著者 Christian,
あなたが望むなら@Makoudaあなたはゴーダチーズの一部をファームウェアと呼ぶことができます。 「ファームウェア」という言葉の主な概念は、次のとおりです。 BIOS用のプロセッサの機械語命令、ブートストラップローダ、または特殊なアプリケーションなど、ROMに常駐するものすべて
追加された 著者 Christian,
ここでの答えは「はい」だと確信しています。
追加された 著者 Connor Wolf,
ほぼ確実に両方。多くのプログラムにデータがありません。
追加された 著者 Alireza Tabatabaeian,
@vaxquisまた、私たちが「フラッシュ」することのいくつかは、最初にvon Neumannアーキテクチャを使用しないAVRやPICなどのプロセッサを使用することにも注意してください。これは、コードをデータとして使用できないという意味ではありませんが、そのためには追加の作業を行わなければなりません。 (それは私たちがデータをフラッシュするのではなく、単にあなたの主張に答えるという意味でもありません。)
追加された 著者 hopfk,
immibisはそれにもっと投票に値する。また、(E)EPROMファームウェアの昔はファームウェアは通常デバイスに「焼き付け」られていたため、ターゲットが「フラッシュ」メモリになることが多いため、ファームウェアの「フラッシュ」という用語がより一般的になりました。この2つは異なっていても同じでなくてもかまいません。それは単なる言語です。
追加された 著者 John U,
ロード命令コードまたはデータのアドレスオペランドはありますか。
追加された 著者 Stroboskop,
@vaxquisは私がpickitで入れたPICコードはファームウェアであると言えますか?
追加された 著者 goblin,
マシンコードは、CPUの不変の配線への単なるデータ入力です。
追加された 著者 immibis,
"ネイティブバイナリ" (またはタイトルで参照されている "コード" )という概念は間違っていると思います。あなたの "ネイティブバイナリ"と "データ"の唯一の違いは、 "バイナリ"がファイルとして格納されているファイルシステムがあると仮定しているのに対して、あなたの "データ"は単にファイルシステムなし構造が好きです。コードはデータなので、ファームウェアはコードであり、ファームウェアはデータです。データコードを作成するのは実行可能性であり、ファイルにパックされているという事実ではありません。明らかにそれは実行可能なので、それはコードであり、コードはデータです。
追加された 著者 Matt,
ACPIコードはある種のVM上で動作するように定義されていますが、多くの場合ファームウェア(の一部)と見なされています。
追加された 著者 PlasmaHH,
@Jason_L_Bens、私はトースターにArduinoを入れてみましたが、はんだが溶けてボードが燃えて混乱しました。代わりにベーグルスロットを使用したほうがいいですか。 ----「ファームウェア」は多くの罪をカバーすることができます。これは、PC BIOSやフラッシュされたブートストラップローダーなどの実行可能コードです。それは実際のハードウェア上で動作する命令であり得、「実際の」プログラムへの「アセンブリレベル」コードインターフェースを提供する。それは単なるシステム設定データであって、プログラムそれ自体ではないかもしれません。そのため、明確な答えはありませんが、「ファームウェア」を 使用することは「コード」を意味します。
追加された 著者 Phil Perry,
これは本当に良い質問です。それは「私のトースターはトーストではない。それにarduinoを入れることができるだろうか?」のスルーからの素晴らしい休憩です。質問です。
追加された 著者 JarsOfJam-Scheduler,
@vaxquisそれこそまさに彼が求めていることです。コードデータですか?はい。それが彼が尋ねに来たものです。彼が「不変プログラム」と呼んでいるものについての彼の質問は、他の場所で明確に説明されているほどではないと思います。
追加された 著者 JarsOfJam-Scheduler,

9 答え

そのような定義としばしば同様に、私たちはほとんどの場合同意します、しかしファームウェアであるものとそうでないものの間に実際に明確な境界がありません。ファームウェアは

  • 永続的に保存されています(変更可能な知識のある人を除く...)
  • 変更を意図していません(...を除く)
  • 他のソフトウェアの助けを借りずにプロセッサ上で動作します(ただし、あなたはそれを入手しますか?)

(ファームウェア)インタプリタによって解釈されるデータに関して:これは製品をより高価にするので、プロの設定ではあまり行われません。同じ目的を達成するにはより多くのメモリ、CPUパワーなどが必要です。これは趣味の設定で使われることもありますが、基本的にはフラッシュのBasicインタプリタや、eepromに保存された(またはトークン化された)Basicアプリケーションで使用されます。例えばPICAXEと様々な基本スタンプをチェックしてください。

そのような設定でのIMOはBasicインタプリタとBasicアプリケーションの両方をファームウェアと呼ぶべきです。


保存されたコードを解釈するファームウェアインタプリタ(IMOもファームウェアと見なすべきです)の興味深い使い方はXBOX 360の起動です。この優れた講演では、詳細について説明しています。


以下のMSaltersは、FPGAコード/コンフィギュレーションデータをファームウェアと見なすべきかどうか疑問に思います。

最も重要な点(生産プロセスの後半で変更可能な情報ですが、エンドユーザーが自由に変更することは意図されていません)では、FPGAビットはファームウェアのように動作します。それは、定義に反してファームウェアがファームウェアであるかどうかという疑問を投げかけます。重要な点は、それがファームウェアのように書かれ、扱われ、そして管理されることができる(そしてそうあるべきである)ということです。 (アヒルのように歩いて震えたら、アヒルですか?)

定義が役に立たないときに定義を気にするなマイクロコードファームウェアですか。表現は重要ですか?文脈は重要ですか? IWMファームウェアのROMビットはありますか?


OPの質問に対するVaxquisのコメントは私が彼がリンクしているWiki記事を読むことを私に促しました。そこに与えられたファームウェアの定義(永続的なメモリとプログラムコードとそれに格納されたデータ)は面倒です。 IMOカーナビゲーションシステムに保存されている地図はデータであり、ファームウェアではなく、保存方法に関係なく(Wikiによるとファームウェアになります)。そしてあなたのiPhoneやAndroid携帯のアプリはアプリケーションであり、ファームウェアではありません(wikiによるとそれらもファームウェアであるべきです)。

27
追加された
私は今、FPGAプログラムがファームウェアとしてカウントされるのかどうか疑問に思います。直感的には、はい、しかしそれはプロセッサ上で動作しません。それでも、コードとデータの中間にある古典的なビットの場合です。
追加された 著者 Jonathan Hartley,
TI 99/4コンピュータ(1979年)には、GPLと呼ばれる言語用のROM内のインタプリタと、GPLで書かれたBASICインタプリタが含まれていました。 GPLの本質的な特徴は、GROMチップ(主にシーケンシャルアクセス用に設計され、ランダムアクセスROMより物理的に小さくて安価にすることができる)に格納されたコードを実行できることですデザインがベーシックスタンプのそれに類似している市販のパーソナルコンピュータ。
追加された 著者 firedfly,

ファームウェアは、フラッシュメモリなどの不揮発性メモリに格納されているプログラムコードです。この用語は組み込みシステムに関連して最も頻繁に使用されます。プロセッサと同じチップに搭載することも、別のデバイスに搭載することもできます。

14
追加された
それは単なるデータです。揮発性または不揮発性メモリに保存できます。
追加された 著者 Mark Biek,
@glglglは同意した。これらはルックアップテーブルの形式と見なすことができると私は主張するかもしれませんが、私たちは今や要点を超えていると思います。
追加された 著者 Joao da Silva,
私があなたの#2のために使うだろうという用語は「ルックアップテーブル」でしょう。私が考えることができる例は数値制御発振器に使用される正弦関数値でしょう。
追加された 著者 Joao da Silva,
@KGregoryそれはルックアップテーブルにすることができます、それは解釈プログラムにすることができます、それは画像データにすることができます...
追加された 著者 WOPR,
おかげで@Leon Heller(+1) - 入力データをチップ上の固定バイナリに「フラッシュ」するという上記の2番目の例の名前はありますか?それともこれは一般的に行われていませんか?再度、感謝します!
追加された 著者 Fab-B,

どちらの方法も、マイクロプロセッサをさまざまな抽象化レベルで見た場合、どちらも正しいと思います。不変バイナリと呼んでいるのはハードウェアそのものであり、それができることはかなり限られています。命令アドレス0x0000をフェッチし、命令をデコードし、供給されたアドレス/レジスタをフェッチし、実行し、命令カウンタをインクリメントする。それがマイクロプロセッサのパイプラインです。変更することはできません。マイクロコントローラの動作は、命令をメモリに格納して順番に読み出すことによって制御します。したがって、基本的に、はい、ファームウェアは、低レベルの抽象化で、不変プログラム用の単なる入力データです。しかし、通常は、ファームウェアをマイクロプロセッサを制御する特別なプログラムと考えるほうが簡単です。概念的にはその方が簡単だからです。

9
追加された
少なくともそれらはフォンノイマンアーキテクチャでも同じです。別々のバスを手に入れたら、それらは違うものであると主張し始めることができますが、それはすべて最後のビットにすぎません。
追加された 著者 JarsOfJam-Scheduler,
データとコードを強調するためによくできたこの答えを+1してください。結局同じことです。
追加された 著者 Lieu Zheng Hong,

それは実際には両方です。

ファームウェアの一例はPC BIOSであり、BIOSの1セクションは実行可能であるが、BIOS自体の他の部分は実際にはデータであり、特にそれが基礎とする技術のタイプにかかわらずBIOSROMの異なる機能を列挙する表示用テーブルにある。に。多くの場合、データは、CMOS SRAMまたは他の互換性のあるメモリチップテクノロジのいずれかの別のフラッシュメモリ、バッテリ、またはコンデンサバックアップRAMに格納されます。

ファームウェアは、不変/不揮発性メモリのために使用される一般的な用語です、それはそこにあり、回路に電気的に問題がない限り、またはEEPROMやフラッシュのために動かなくなります。 ROM

ファームウェアは、定義上、システムまたは組み込みコンポーネントにインストールしたハードウェアを初期化、テストし、オペレーティングシステムがコンポーネントを使用できるようにするために必要な低レベルのルーチン(BIOS関数呼び出しとも呼ばれる)を提供します。あなたのシステムで。昔は、BIOSやBasic Input Output Systemにも、1970年代のCommodore 64やその他のパーソナルコンピュータのような "BASIC"と呼ばれるプログラミング言語が含まれていました。プロのコンピューター科学者によっても。文字ROMまたはシンボルROMを聞いたことがあれば、エグゼクティブROMまたはプログラムROMがその文字ROMにアクセスして順番に文字を検索したり、チップ全体をRAMにダンプして作業するための純粋なデータです。そこ。

デフォルトのPROM、EPROM、EEPROM、フラッシュプログラマは、同様のフォーマットである.hexまたは.binの接尾辞を付けてチップ上にファームウェアを焼き付けます。

また、ファームウェアBLOBファイルがあります。これらは実行時にロードされるライブラリやルーチンの形式の実行可能ファイルです。その良い例はワイヤレスハードウェアドライバです。コンピューターシステム。唯一の違いは、カードとUSBベースのファームウェアが実際にそれらを保存するのではなく、あなたのハードディスクに保存してメモリにロードすることです。それは本質的に翻訳サービス層とフィルタとして働きます。 データでもコードでもあります。

私の基本は、他のコンピュータや組み込みシステム用のBIOS(実際にはオペレーティングシステムの起動時に実際にロードされ、次にランタイムファームウェアを含む低レベルハードウェアドライバのロードを開始するワイヤレスファームウェアなど)を実際に書くことです。 )ファームウェアは、製造元からアップデートを入手してから古いアップデートを上書きしない限り、そのルーチンを変更することはないため、ファームウェアと呼ばれます。この場合、新しいものが更新されるまで新しいファームウェアとして機能します。そうでない場合は、それがオペレーティングシステムのロード時に使用するファームウェアです。

私は同意します、それは恒久的な解決策としてチップ上に技術的には存在せず、ファームウェアを更新するための特別なツールとアプリケーションを必要とするのでファームウェアと呼ぶべきではありません(古いBIOSとフラッシュメモリの場合)。

それ以上質問がある、私はあなたのためにそれらに答えることがうれしいです。

8
追加された

ファームウェアは、ソフトウェアコードと同じように、何らかの開発環境で作成されたコードですが、CPUが理解できるように、マシンコードに変換されます。もしあなたがマイクロコントローラや他のチップのメモリをダンプすると、それはCコードや我々がそれをプログラムしているもののようには見えないことに気づくでしょう。

それであなたはそれに.EXEをプログラムしない、なぜならそれはある種のOS環境で走るためにコンパイルされたプログラムだから。通常は.hexまたは.elfでプログラミングします。実際にはプログラミングしているデバイスに依存しますが、ファイルタイプには関係がないので、コンパイラは代わりにコンパイルします。マシンコードにコード化して、チップオンチップフラッシュまたはそれが持っているどんな記憶方式にでもそれを置く。

ファームウェアは、環境条件をプログラムする必要があるという点で不変です。ファームウェアコードを変更したままにしておくことはできません。変更を加え、コンパイルし、デバイスを再フラッシュする必要があります。

  • 通常、ソフトウェアコードは、オペレーティングシステム上で実行されるコードです。
  • ファームウェアコードは、チップのベアメタル上で実行される情報です。ファームウェアは、実際のアプリケーションプログラムでも、単純なオペレーティングシステムでもかまいません。その場合、組み込みの世界では、リムーバブルストレージまたはフラッシュRAMを使用してソフトウェアをロードできます。 このレベルはバイナリコードにまで及ぶ可能性があります。これはまだコードです。
  • 電圧で直接作業を開始すると、ハードウェアレベルに到達しました。
6
追加された
プロセッサが理解するものは、バイナリですが、アセンブリ言語でプログラムするというニーモニックオペレーションコード(業界で見られるオペコード)と呼ばれるものがあります。 ])。
追加された 著者 Burak Erdem,
「しかし、その後、CPUが理解できるように、マシンコードに変換されます。」 Cやそれに似たもので書かれている限り、ソフトウェアコードと同じように。
追加された 著者 WOPR,

ファームウェアは、ソフトウェアの世界とハードウェアの世界の中間にあるものを特定するために一般的に使用される一般的な用語です。

ハードウェアは変更が困難です。ソフトウェアは簡単に変更できます。ファームウェアはハードウェアほど変化しにくいわけではありませんが、ソフトウェアより変化しにくいです。

実行可能コード、データ、または変更可能な構成情報(FPGA/PLDなど)を議論するために使用することができます。

0
追加された
広い意味での言葉と定義は本当です。しかし、これらのチップは実際にはコードでもデータでもありません。コンパイラは、完成時に、完全な解決策として、またはシステムのさまざまな部分をつなぎ合わせるためのロジックの接着として、論理設計を作成します。解決策を作るのに物理的な74と54シリーズの論理ゲートとレジスタを使う代わりに。 Adam、これを実現してくれて本当に嬉しいです。
追加された 著者 Burak Erdem,

ファームウェアがどのようなものであるかについて、内側からの説明をすること。

ファームウェアは、非常に特殊なハードウェア上で実行されるコードです。つまり、オペコードは、それが書かれたハードウェアに固有のものです。それは、チップやインターフェースのファミリー、または1つのアイテムだけを意味します。

基本的にファームウェアがすることはこれです。

  1. 与えられたプロセッサが着手して実行する命令をハードワイヤードで持っています。これは「ブートストラップ」と呼ばれます。どの起動コンピュータがBIOSにこれを搭載していますか。

  2. ファームウェアの指示に従って上記のハードウェアを初期化します。

  3. ジャンプテーブルをロード/アップします。

  4. 特定の端末の登録へのアクセスをアクセス可能にします。

  5. コールド(電源オフ状態)またはウォームスタート(通常の再起動またはリセットピンが使用された)後にBIOSが使用された後は、終了ルーチンに制御を渡します。

  6. ほとんどのBIOS(ファームウェア)は、特定のチップセットを念頭に置いて設計されており、それらの機能をすべて排除し、コンピュータや組み込みデバイスの特定のバスラインに接続できるデータをすべて取り除きます。 p>

  7. ハードディスクは、それ自体が組み込みデバイスであり、BIOSも搭載されており、チップ上にファームウェアの形式を持つストレージソリューションの好例です。

基本的に、すべてのファームウェアは、他のプロセッサが前記デバイスから機能を取得するために行う一連の命令です。それは物理的なデバイスにロードされるソフトウェアです、電力を失うと、それはデバイスが電力を取り戻すときそこにあるでしょう。

技術的には、バイナリファイルを作成するために任意のプログラミング言語またはスクリプト言語を使用できます。ターゲットとするプロセッサの動作方法、実際の命令コード、内部レジスタ(それらが何を目的としているのかはもちろん)、知っておく必要があるのは、2進数と16進数のシステムです。アセンブリ言語であなたのコードを。それが完了したらそれからあなたはそれをバイナリに変換するために別のプログラムに仕事をすることができますそしてそれから.binまたは.hexファイルとしてそれを保存します。

Ada、C、C ++、Dおよび他のプログラミング言語がどのようにして擬似オペコードに切り分けられたネイティブコードである「トークン」を機械語に変換するのかを知りたい場合。私があなたが読むことをお勧めするいくつかの本があります、いくつかは非常に小学校で、非常に特定のプロセッサを中心にしています、しかしそれは学ぶことはよいです。とりあえず私はあなたに1冊の本を渡します、なぜなら私はあなたや他の誰かがこれを情報として読んでいる人を溺れさせたくないからです。

  1. Crafting A Compiler with 'C' by Charles N. Fischer & Richard J. LeBlanc, Jr.
  2. Do visit this site, it's based on the x86 chipset found in the IBM PC; http://www.laynetworks.com/assembly%20tutorials.htm

それがPC上でのアセンブリ言語プログラミングのごく初期の紹介です。それは割り込み(ハードウェアとソフトウェア割り込み)と他の多くのトピックを扱うことについて話します、それはBIOSが実際にすることとそれをどう扱うかについてより深く説明します。

アセンブリ言語や機械語とは異なり、Ada、C、C ++、Dでは、ハードウェアの詳細が分からなければ、もっと多くのことをやめることができます。アセンブリ言語や機械語では、自分が何をしているのかわからなければ、悪いことが起こるか、コードが機能しません。私は後者のケースを好む、動作しない対悪い何か。

注:上記の回答については、フラッシュRAMについては、そのようなことはありません、フラッシュROMはありますがフラッシュRAMはありません。フラッシュROMにはファームウェアが内蔵されているか、バッテリまたはコンデンサでバックアップされているRAM、または設定したBIOSのオプションのパラメータを含む別のフラッシュROMがあります。

それがフラッシュROMまたはRAMチップであるならば、(プログラムメモリ/ファームウェアそれ自身に対して)データメモリをどのように格納またはクリアするかについてのファームウェアのコードがあります。あなたのBIOSのパスワードが文字化けしたり、それを覚えていない(あるいは誰かがあなたをめちゃくちゃにしている)場合、PCではケースを開けて「CMOS CLR/CMOSクリア/ BIOSリセット/ BIOS RST」という2つのピンを見つけることができますこれら2本のピンを一緒にショートさせるとメモリもクリアされます。2本のピンがまだショートしているときにリセットボタンを押すだけです。これによりパスワードがクリアされ、PC BIOSへのフルアクセスが可能になります(1990年代以降の新しいコンピュータを使用していると仮定した場合)。

新しいPCには、ファームウェア用のフラッシュメモリとバッテリバックアップSRAMがあります(DRAMチップのように常に更新する必要はありません。古いテクノロジに基づいています)。

0
追加された

I believe that using the "historical" perspective, might give a more basic understanding of what firmware is.
It first starts with "hard-ware." To provide/create a given function, one could use tubes, relays, transistors, & ICs. You would use a number of these components and you would create a device that performed the required function. This was considered "hard-ware" because if you wanted (or needed) to change the function, you would need to unsolder wires, sockets, etc. and this was "hard" to do. Thus, this method of implementing a function became know as using hardware. Using a CPU, RAM, and code, became another method of creating a function, and became known as "soft-ware" because it was very "easy" to make design changes." However, there was also a need (mostly from manufacturers), to complete as much of a design as early as possible, but be capable of making "last minute" design changes as easy and cost-effective as possible. The use of ROMs allowed this flexibility up to the point of "first ship." EEPROMS allow changes even after "first ship" (in the field). The code needed/used for the ROMs and PROMs was give the name of "firmware."

0
追加された

組み込みシステムに関しては、ファームウェアのフラッシュは、フラッシュデバイスを使用してマイクロコントローラのROMを消去し、それを新しいコードで書き換えたことを意味します。このフラッシュされるファームウェアはHEX形式です。

OS関連の用語では、ROMでもフラッシュされますが、今回はアップデートが来たときにフラッシュするのがOSの責任です。

0
追加された