これは、オペレーティングシステムを記述している場合、何を記述しているのかということです。1980年からマイクロプロセッサの基礎の本を読んでいるときにこれを尋ねると、この質問が頭に浮かびました。
最初のマイクロプロセッサチップはどのようにプログラムされましたか?
答えは明らかかもしれませんが、それは私を悩ませています。
これは、オペレーティングシステムを記述している場合、何を記述しているのかということです。1980年からマイクロプロセッサの基礎の本を読んでいるときにこれを尋ねると、この質問が頭に浮かびました。
最初のマイクロプロセッサチップはどのようにプログラムされましたか?
答えは明らかかもしれませんが、それは私を悩ませています。
回答:
私はあなたの質問を文字通り受け止めて、コンピューター全般ではなく、ほとんどマイクロプロセッサーについて議論します。
すべてのコンピューターには、ある種のマシンコードがあります。命令は、オペコードと1つ以上のオペランドで構成されます。たとえば、Intel 4004(最初のマイクロプロセッサ)のADD命令は1000RRRRとしてエンコードされました。1000はADDのオペコードで、RRRRはレジスタ番号を表します。
最初のコンピュータープログラムは手書きで記述され、1と0を手でエンコードして機械語でプログラムを作成しました。これはチップにプログラムされます。最初のマイクロプロセッサはROM(読み取り専用メモリ)を使用しました。これは後にEPROM(消去可能なプログラマブルROM、UV光で消去される)に置き換えられました。現在、プログラムは通常、EEPROM(「電気的...- EPROM」、チップ上で消去可能)、または特にフラッシュメモリにプログラムされています。
ほとんどのマイクロプロセッサーは、RAMからプログラムを実行できるようになりました(これはマイクロコントローラーを除くすべての標準です)が、そもそもプログラムをRAMにロードする方法が必要です。Joby Taffeyが彼の答えで指摘したように、これはIntel 8080(4004と8008に続く)を搭載したAltair 8080のトグルスイッチで行われました。PCには、コンピューターを起動し、OSをRAMに読み込むために使用されるBIOSと呼ばれるROMが少しあります。
機械語は非常に速く退屈になるため、ニーモニックアセンブラー言語を使用して、通常は命令ごとに1行のアセンブリコードを機械語に変換するアセンブラープログラムが開発されました。したがって、10000001の代わりに、ADD R1と記述します。
しかし、最初のアセンブラーはマシンコードで作成する必要がありました。その後、独自のアセンブラコードで書き換えることができ、マシン言語バージョンを使用して初めてアセンブラコードをアセンブルしました。その後、プログラムはそれ自体を組み立てることができます。これはブートストラップと呼ばれ、コンパイラでも行われます。通常、最初にアセンブラ(または別の高レベル言語)で記述され、次に独自の言語で書き換えられ、コンパイラがコンパイルできるまで元のコンパイラでコンパイルされます。
最初のマイクロプロセッサはメインフレームとミニコンピューターが登場してからずっと後に開発され、4004はアセンブラーの実行にはあまり適していなかったため、Intelはおそらく大型コンピューターの1つで実行されるクロスアセンブラーを作成し、アセンブリコードを翻訳しました4004をバイナリイメージに変換し、ROMにプログラムできます。繰り返しますが、これはコンパイラーを新しいプラットフォームに移植するために使用される一般的な手法です(クロスコンパイルと呼ばれます)。
もともと、プログラムは紙に書かれてから、コンピューターが利用できるあらゆる入力方法に置き換えられました。これは、最初のコンピューターのノブ、スイッチ、ジャンパー線から、パンチカード、キーパッド/ボードに行きました。
読み取り専用メモリの初期の形式の1つは、アドレスが行を選択し(ローに引き下げる)、列がデータを表すグリッドでした。各列にはプルアップがあり、各交差点には「ゼロ」を表すダイオードがはんだ付けされているか、「1」を表すダイオードがありません。必要なダイオードの数]。適切なダイオードにはんだ付けすることにより、任意のビットパターンを「プログラム」できます。
この設計は、ヒューズPROMの形で集積回路の世界に持ち込まれました。基本的に、ヒューズPROMは上記のような回路で、すべてのダイオードが実装され、すべてのダイオードに弱いヒューズが直列に接続されていることを除いて、チップに組み込まれています。出荷時、PROMはすべての場所で「0」を読み取ります。ただし、適切なアドレスを選択し、適切なデータラインを「ハード」ハイに駆動することで、ダイオードを選択的に削除できます[注:各ビットには、ダイオードではなく独自のトランジスタがあったと考えられますが、原理は同じです]。
ヒューズでプログラムされたPROMは、内部コンデンサに電荷を注入することでビットを保存する半導体メモリに引き継がれました。このようなメモリは、ヒューズPROMよりもコンパクトであるだけでなく、UV透過パッケージに格納されている場合、消去されて再利用される可能性があります。いわゆる「ワンタイムプログラマブル」メモリでさえ、ほとんど常にこの同じデザインを使用しますが、単にUV不透明パッケージに格納されていることに注意してください。
1950 MIT Whirlwind Computerのダイオードマトリックスコントロールストア
2005年のMT15 CPUのトランジスタマトリックス制御ストア
OPの本当の質問に誰かが答えているかどうかはわかりませんが、それは「コンピューターはどのように始めるかを知っているのですか?」、それで私はそれにクラックを取るでしょう。
類推から始めます。「トランジスタは、どのように開始するのかを知っていますか?」もちろん、そうではなく、物理学に従って動作するだけで、エンジニアは既知の状態で起動するように回路を構築します。
コンピューターは回路であるため(もちろん非常に複雑です)、特定の状態で起動するように構築されているため、起動方法を知っています。現代のマシンでは、その状態は、メインバスがアドレス空間の一部をマザーボード上のROMをローメモリ(ROMがBIOSで焼き付けられたもの)としてユーザーに再マップする状態になります。第1世代のマシンでは、初期状態がCPU停止、プログラムカウンターがゼロ、メモリトグルサブシステムがアクティブであった可能性があります。
オペレーティングシステムは、プロセッサ上で直接実行されるコンピュータープログラムです。コンパイルまたはアセンブルしてマシン命令に変換できる任意の言語で作成できます。アセンブリとCは一般的な選択肢です。
コードは、ストアから一度に1つの命令(ROMまたはRAM)でプロセッサーにロードされます。
Z3は、第1のプログラム可能なプロセッサは、電気機械式リレーから構築し、パンチフィルムからの指示を読んでました。
最初のパーソナルコンピューターであるAltair 8800は、スイッチを切り替えることでプログラムされました。
プロセッサがデジタルロジックから構築される方法については、https://electronics.stackexchange.com/questions/5516/a-fun-book-to-learn-computer-architecture-for-not-exactly-beginnersをご覧ください。
履歴については、http://en.wikipedia.org/wiki/History_of_computing_hardwareを参照してください
古いコンピューターについて少し説明します。
私の知る限り、昔は、プログラムに使用される大きなコンピューターのフロントパネルがありました。基本的に、これらのコンピューターの各メモリセルはスイッチに接続されていました。メモリに電力を供給し、スイッチを使用して各セルにデータを設定します。この方法では、プログラムを少しずつコンピューターのメモリに入力します。次に、プログラムの開始点を設定し、実行を開始します。
技術が進歩するにつれて、いわゆるブートローダープログラムが開発されました。それらは、コンピュータのメモリから別のプログラムを起動することが全体のポイントである短いプログラムです。プログラムを少しずつ(および8進数以降の16進数を使用して1ビット以上)入力する際の問題は、処理が非常に遅く、プログラムの読み込み中にオペレーターがミスをする可能性が高いことでした。そのため、短いプログラムを使用して、コンピューターのメモリに保存されている大きなプログラムをロードします。時間が経つにつれて、手で入力しなければならないコードの部分が減り、現代のコンピューターでは、ブートローダーがROMやフラッシュメモリに書き込まれることがよくあります。
数年前、4桁の7セグメントディスプレイと六角キーパッドを備えたマイクロコントローラープログラマーに出会いました。これにはマイクロコントローラが搭載されていなかったと確信しており、一度に1バイトずつマシンコードを直接入力できました。
したがって、これにより、(苦労して)Opコードのリストを1つずつ手動でコンパイルし、チップに入力することができます。
まだ入手できるかどうかはわかりませんが、マイクロコントローラが比較的新しいときに似たようなものが使用されたと推測しています。