ディジタル・イクイップメント・コーポレーション(DEC)が1970年代から1980年代に販売した16ビットミニコンピュータシリーズ[1][2]。DECのPDPシリーズのPDP-8コンピュータの主にリアルタイムシステムの後継であるが、両シリーズは10年間以上並存した。革新的機能をいくつか持ち、従来よりもプログラミングが容易になっていた。ミッドレンジのミニコンピュータとしての後継は32ビットのVAXである。その設計上の特徴は、モトローラのMC68000などのマイクロプロセッサの設計に影響を及ぼしている。設計は他のOS、例えばCP/M[3]やMS-DOS[4]の設計に影響を及ぼしている。PDP-11のプログラミング上の低レベルな特徴とC言語の言語要素の類似は非常によく言われてはいるが[5]、意図的にそのように設計したわけではない[6]。operators#Historyを参照)。Novaはワード長16ビットだが、DECが当時主力としていたPDP-8のワード長は12ビットだった。PDP-11ファミリは1970年1月に発表され、同年前半に出荷が開始された。最終的な売り上げ台数は不明であるが、販売開始後の8年間で5万台が売れたことが知られている[7]。当初はTTLのICで構成されていたが、1975年にはやや大規模な集積回路を使いCPUをワンボード化している。1990年に登場した[2]。命令セット編集プログラマがPDP-11を好むのは、その直交性の高い命令セットによって命令の種類とメモリアクセス方法を分けて考えることができるからである。任意のメモリアクセス方法(アドレッシングモード)を任意の命令に使用でき、他の命令セットのように例外事項を覚えておく必要がない。命令しかなく、転送元と転送先のどちらのオペランドでもメモリもレジスタも指定可能である。入出力専用の命令がなく、直交性によって入力デバイスから出力デバイスへ直接データ転送することも可能である。同様に加算命令も任意のオペランド(メモリ、レジスタ、デバイス)を加える数としても計算結果の格納先としても使える。PDP-11の命令セットアーキテクチャはB言語の慣習的構文に影響を与えていると言われているが、間違いである。いった式に対応していると言われている。いった式は1個の機械語命令にコンパイルできる。デニス・リッチーは、B言語設計時にPDP-11は存在しなかったのだからこの伝説は間違いだと、明確に否定した。PDP-7の自動インクリメントセルがPDP-11のアドレッシングモードに影響している可能性はあるが、B言語そのものはPDP-7のその機能も使っていないと述べている[8]。それでも、C言語はPDP-11で実装する際にPDP-11の持つ細かい利点を活用しており、そのために後のプロセッサの設計に影響を与えた可能性はある[9]。論理的には、アドレッシングモードと命令セットによってベースが提供されていると言える。2オペランド命令は、2つの6ビットフィールドでオペランドを指定し(3ビットがレジスタ指定で、3ビットがアドレッシングモード指定)、4ビットで命令コードを指定する。1オペランド命令は、6ビットでオペランドを指定し、10ビットで命令コードを指定する。どの命令でもオペランド指定フィールドには任意のアドレッシングモードを指定できる。8本のレジスタ(0番から7番まで)で、7本のレジスタは任意の用途に使用可能だが、6番のレジスタはいくつかの命令ではスタックポインタとして認識され、7番のレジスタはプログラムカウンタである。プログラムカウンタがプログラマから見えているという発明とアドレッシングモードの組合せで、絶対アドレス指定と相対アドレス指定が可能となった。アドレッシングモードとしては、レジスタ、即値、絶対アドレス指定、相対アドレス指定、間接アドレス指定、インデックス付きアドレッシングがあり、さらにレジスタの自動インクリメント/自動デクリメント(バイト操作なら1、ワード操作なら2)を指定できる。相対アドレス指定を使えば、機械語プログラムを位置独立にできる。PDPエンディアン編集PDP-11のエンディアンは独特であった。16ビットワードはリトルエンディアンで格納される。下位バイトがアドレスの小さいほうに格納される。32ビットワードを構成する2個の16ビットワードは、ビッグエンディアンで格納される。上位16ビットワードがアドレスの小さいほうに格納される。ここで、各16ビットワード内は前述のようにリトルエンディアンである。このようなミドルエンディアンにまつわる問題を「NUXI問題」と言う。いう文字列をPDPエンディアンの順序で並べ替えたものに由来する。他機種に移植した際、最初の起動メッセージ(しばしば、本格的な初期化に入る前、最小限のブートが完了したことを示すため、短い文字列を出力することがある)として「UNIX」ではなく「NUXI」と出力されたことがあった、と言われている。いうメモリバスしか持たない。それぞれに割り込みベクターと割り込み優先度が設定される。プロセッサのアーキテクチャが可能にしたこの柔軟性の高いフレームワークにより、新たなバスデバイスを容易に考案でき、当初予想もしていなかった新たなハードウェアの制御も可能である。DECはこのUnibusの基本仕様を公開し、バスインタフェース回路基板のプロトタイプも提供し、ユーザーが独自のUnibus対応ハードウェアを開発できるようにしていた。これにより、PDP-11は特注の周辺機器の制御を得意とした。管理システムとしてPDP-11と組み合わせて配備され、Unibus経由で直接接続されていた。PDP-11ファミリの上位機種であるPDP-11/45やPDP-11/83システムは、この単一バス方式をやめている。その代わり、CPU筐体内だけでCPUとメモリ間の専用インタフェース回路を使用し、UnibusやQ-busはI/O専用とした。入出力機器はこういった構成でもメモリアドレス空間にマッピングされ続けたが、追加されたバスインタフェースの設定のためのコードを追加する必要があった。割り込みシステムはなるべく単純になるよう設計され、割り込みシーケンスでイベントを逃さないことを保証している。デバイスが割り込みを発生する場合、4本の優先度ラインのいずれかをアサートする。プロセッサは優先度毎の割り込みデイジーチェインに応答する(デイジーチェインはイベントを順番に並べる一種の論理回路である。最初の論理ゲートが最初に処理される。デイジーチェインはその優先度でのデバイス間の優先順位に従って設定される)。PDP-11の設計では、この割り込み応答順はデバイスが物理的にCPUに近い順番になっている。CPUが応答すると、デバイスはそのベクターアドレスをバスに出力する。これは4バイトのメモリブロックのアドレスである。CPUはステータスレジスタとプログラムカウンタをベクターテーブルからロードする。このときのステータスレジスタの値は割り込みを不可とするようになっている。プログラムカウンタにロードされるアドレスは割り込みハンドラのスタートアドレスである。割り込みハンドラがデバイスに関する処理を行い、その過程で割り込んできたデバイスの割り込み信号を再設定する。命令でCPUが割り込まれた箇所に戻る。戻ったところが低優先度の割り込みの処理中の場合もあり、割り込み処理の入れ子が可能である。このような処理によって割り込みを受け付けそこなうことを防いでいる。未処理の割り込みはどの段階であってもそのまま存在していて、次のサイクルで処理可能である。割り込み処理が間違って起動されるとCPUはタイムアウトとなり、特殊な擬似割り込みを発生してユーザーに対してハードウェア故障を警告する。大量生産のための設計編集PDP-11は工場でそれなりに熟練した労働者が生産できるよう設計された。あらゆる観点から個々の工程の危険性を低減している。ワイヤラッピング式のバックプレーンを使用し、プリント基板をバックプレーン上のコネクタに差し込むようになっている。バックプレーン上のコネクタ同士はワイヤラッピングで接続される。ワイヤの被覆(テフロン)を剥いだ銅線(鍍金された硬い単芯線)が端子(四角柱の角)に巻かれて食い込むことで密着する。このコネクタ部分は電話の交換機などとよく似ている。大規模集積回路を使用した最初のPDP-11である。CPUはウェスタン・デジタル製の4個のLSIチップ(MCP-1600チップセット)で構成される。Unibusによく似たQ-busを使用。アドレスバスとデータバスが物理的には同じ線を共有していることである(マルチプレクサ)。18ビット)とブロック転送モード(Unibusにはない)をサポートし、全体的には性能が大幅に向上している。CPUのマイクロコードには直接RS-232Cまたはカレントループ(英語版)で端末と通信できるデバッガが組み込まれている。当時、そのようなデバッグには制御パネルのスイッチとランプを使うのが普通だったが、端末からコマンドを入力して指定したメモリアドレスやレジスタの内容を八進数で表示できた。このデバッガはコンピュータのレジスタを調べたり、メモリや入出力機器を調べるために使われた。従って、CPUが機能しない場合でもコンピュータの内部状態を調査して修理することが可能であった。マイクロコードには汎用ブートストラップが含まれ、DEC製の全てのディスクドライブを使用可能であった。これら2つの発明はコンピュータが動作中は使われない。ハードディスクからブートできないとき、フロッピーからのブートを試すなど、全く起動しないときデバッガを使うといった使い方になる。これによって信頼性が向上し、全体としてコストを低減させている。)はDECが独自設計したチップセットを使用している。Unibus対応のPDP-11も後々まで継続し、CPUはQ-bus仕様のプロセッサカードを採用しつつ、アダプタでUnibusと接続してUnibus用周辺機器が使えるようにしており、中には特別なメモリバスを採用して性能向上させた機種もある。Q-bus系機種では他にも大きな技術革新があった。基本設計は非常に優れていて、最新技術も次々に取り入れていった。UnibusやQ-busのスループットがシステム性能のボトルネックとなっていき、最終的に16ビットアーキテクチャではどうがんばっても超えられない限界が見えてきた。一部機種では物理アドレス空間を拡張したが、全てのプログラムは16ビットの仮想アドレス空間(64Kバイト)に制限されていた。1980年代にメモリチップが低価格化していったが、PDP-11上のソフトウェアは大容量メモリを簡単には使えなかった。PDP-11の仮想アドレス拡張という意味)はこのような問題に対応したが、当初はハイエンドのタイムシェアリング市場をターゲットとした。初期のVAXにはPDP-11互換モードがあり、32ビットのソフトウェアと同時に既存ソフトウェアも使用可能だった。1Mバイトまでのメモリを扱えた。互換機市場には十分だったが、80286が登場する前に1Mバイトの限界が問題となってきた。80286はセグメントアドレス空間を拡大し、80386では32ビットのリニアなアドレス空間がサポートされた。ような32ビットマイクロプロセッサが登場してきた。量産効果でこれらのマイクロプロセッサは低価格化し、PDP-11はコスト面でも太刀打ちできなくなった。試みも失敗に終わった。パソコン用に製造する会社)に売却した[10]。1997年にはPDP-11ファミリの生産を終了させた。Mentecは数年間、PDP-11アーキテクチャの新プロセッサを製造していた。その互換機が小型コンピュータ市場を席巻したが、DECはそれにうまく対抗策を打ち出せなかった。1990年代後半にはDECを初めとするミニコンピュータ業界は壊滅し、UNIXとWindowsのサーバやワークステーションに取って代わられたのである。2008年時点でも現役で使用されているPDP-11も存在している。[1]2010年7月までに、VHDLで実装したPDP-11/70のIPコアがOpenCoresにて公開された。[11]ライセンスはGPL。S3BOARD)上で初めて動作。BSDのブートに成功。editionを参照)メモリ管理編集PDP-11のアドレスは16ビットであり、64KBまでのアドレス範囲を指定できる。PDP-11からVAXに移行するころ、8ビットのバイトと16進表記が一般的になっていたが、PDP-11では八進表記が普通で、搭載メモリ容量はワード数で表記されるのが普通だった。まで)は周辺機器のレジスタのマッピング用に予約されており、メモリはマッピングされない。したがって、初期のPDP-11の最大メモリ容量は28Kワードだった。この制約に対して、以下のような技法が使われた。後期のPDP-11では、仮想記憶をサポートするメモリ管理ユニットが使われた。物理アドレスは18ビットまたは22ビットに拡張され、256KBまたは4MBのメモリを扱えるようになったが、1つの論理アドレス空間は16ビット(32Kワード)に制限されたままだった。PDP-11/45をはじめとする機種では、命令用論理空間(32Kワード)とデータ用論理空間(32Kワード)を設定可能とした。初期のUNIXなどはこの機能を使っていた。実装では、実行環境が論理空間を8kBのページに分割して制御し、ユーザーからは隠蔽した形でバンク切り換えのような操作を行っていた(外部リンク参照)。多くの命令で6ビットで1オペランドを構成しており、3ビットで8本ある汎用レジスタのいずれかを指定し、3ビットで8種類あるアドレッシングモードのいずれかを指定する。このため八進表記が自然に使われた。以下では仮の1オペランド命令をOPRで表し、アセンブリ言語でのアドレッシングモードの表現を示す。Rnは汎用レジスタを意味し、R0からR7まである。任意の汎用レジスタに適用できる8種類のアドレッシングモードを下表に示す。R6(スタックポインタ)とR7(プログラムカウンタ)については別に解説する。Rnにオペランドがある。Rnにオペランドのアドレスがある。Rnにオペランドのアドレスがあり、命令実行後にRnの内容をインクリメントする。Rnにオペランドへのポインタのアドレスがあり、命令実行後にRnの内容を2だけインクリメントする。命令実行前にRnをデクリメントし、それをオペランドのアドレスとして使用する。命令実行前にRnを2だけデクリメントし、それをオペランドへのポインタのアドレスとして使用する。オペランドのアドレス。Xはこの命令に続くワード。オペランドへのポインタのアドレス。Xはこの命令に続くワード。2オペランド命令では両方のオペランドでこれらのモードを使える。インデックスおよびインデックス間接モードは命令に続くワードも命令の一部として使用するので、2オペランド命令は3ワードになる場合がある。自動インクリメントと自動デクリメントはバイト命令なら1ずつ、ワード命令なら2ずつインクリメント/デクリメントする。間接モードの場合、ポインタ1つ分のインクリメント/デクリメントになるので、2ずつとなる。プログラムカウンタのアドレッシングモード編集R7(プログラムカウンタ)を使用する場合、以下の4つのアドレッシングモードが意味のある効果を発揮する。オペランドは命令内にある。加算したものをアドレスとして使用する。加算したものをアドレスのアドレスとして使用する。絶対モードは例えば、固定のアドレスにマッピングされたI/Oレジスタのアクセスに使用する。相対モードはプログラムの変数を参照する場合や分岐先を指定する場合に使用する。相対モードや相対間接モードのみを使ったプログラムは位置独立となる。プログラムを配置するアドレスが仮定されていないので、任意の位置にロードでき、移動させることも可能である(リロケータブルバイナリ)。イミディエートモードと絶対モードは通常の自動インクリメントモードと自動デクリメント間接モードに対応している。上の表にあるように補助ワードを「命令内」にあるとするか、命令の次のワードと考えるかは立場によって異なる。PCは常に次々と命令を指していくので、常に2ずつ自動インクリメントされる。スタックのアドレッシングモード編集R6はSPと表記されることもあり、トラップや割り込みの際のハードウェアスタックのスタックポインタとして使われる。このスタックは、アドレスの小さい方に向かって成長する。SPまたはプログラマがソフトウェアスタックのスタックポインタとして選択した任意のレジスタには、次のようなアドレッシングモードがある。オペランドはスタックのトップにある。オペランドはスタックのトップにあり、それを使用後にポップする。オペランドへのポインタがスタックのトップにある。それを使用後にポップする。値をスタックにプッシュする。スタックのトップからの相対位置でスタック内の任意のアイテムを参照する。スタックのトップからの相対位置でスタック内の任意のポインタの指すアイテムを参照する。ソフトウェアスタックはバイトも積むことができるが、SPの場合はワードしか積まない。従ってSPの自動インクリメント/自動デクリメントは常に2ずつである。命令セット編集PDP-11はバイト(群)やワード(群)を操作する。バイト(群)はレジスタ番号で指定され、そのレジスタの下位バイトを直接操作するか、そのレジスタでメモリ位置を指す。ワード(群)もレジスタ番号で指定され、そのレジスタの内容を直接操作するか、そのレジスタでメモリ位置を指す。ワードは偶数番地境界になければならない。オペランドのあるほとんどの命令で、ビット15がセットされているものはバイトアドレッシングで、ビット15がクリアされているものはワードアドレッシングである。命令の先頭4ビットが命令コードである(特にビット15でワードアドレッシングかバイトアドレッシングかを示す)。6ビットで1オペランドとなっており、2オペランドある。オペランドの内容については上述のアドレッシングモードを参照。計算し、フラグだけセットする。計算し、フラグだけをセットする。srcADD命令とSUB命令はワードアドレッシングであり、バイトを対象とするバージョンは存在しない。一部の2オペランド命令は、一方のオペランドにレジスタしか指定できない。source/destinationここで、レジスタペアが使われる。「(R,R+1)」のように記述し、Rレジスタが上位ワードであって偶数番目でなければならない。2つ目のレジスタは下位ワード(または余り)である。乗算ではRが奇数番目のレジスタであってもよいが、その場合の積の上位ワードはレジスタに保持されない。