前回までのあらすじ
- メモリを作ったよ!
- ISAを作ったよ!
- アセンブリ言語を作ったよ!
- CPUを作ったよ!
- プログラミング言語を作ったよ!
- 簡易的なシェルシステムを作成したよ!
- ファイルシステムを作成したよ!
- OSを作成したよ!
今回の目標
前回までの記事で,自作OSまで作成することが出来ました.
しかしこのOSの起動・動作はPYNQ-Z2のOSに依存しており,正直実態としてはOSというよりただのプログラムとあまり相違ありません.
という事でこれからの中期目標として,これまでPSに依存していた処理をPLで賄うようにします.
今回はその第一歩として,TCP接続に対応します.
ここから本題
全体を総括するissueはこちら
PSに依存していた処理をPLで賄うと言っても,具体的にどうするかについて説明します.
今まで,自作OSの起動と操作はPYNQ-Z2上のcppファイルを使用していました.そのcppファイルをPYNQ-Z2上のターミナルで実行することで以下の処理が行えます.
- bitファイルをPLに書きこむ
- 標準入力を受け付けて,自作CPUに送る
- 自作CPUから標準出力を受け取ったら,画面に出力する
はい.つまり自作OSのベースとなる部分が全部PS任せだったわけです.
自作OSを起動させて動作させるためには,他のOSがなければならないという状況だったわけです.
という事で,以下のような変更をします.
- bitファイルはPYNQ-Z2に焼いておいて,PYNQ-Z2の電源を入れたら起動するようにする
- ターミナルはSSHを使用して,通常のPCから行う
ただし,以下のような問題があります.
- SSH接続は難しすぎる.暗号化の仕組みが必要
- Ethernet接続を全部実装しようとすると難しすぎる
ということで以下のように進めていきます.
- ひとまずのゴールはSSHではなくtelnetを使用すること(この記事ではまだここまでは進まないけど)
- Ethernetの操作は出来合いのモジュール(W5100S)に任せて,CPU側ではSPI操作だけで完結するようにすること
これは説明が雑すぎますので,具体的な説明は末尾に追加します.
Ethernetモジュールを使用できるようにする
issueはこちら
具体的にはEthernetモジュールを実際に配線して,それを使用できるようにする対応です.
使用する信号はひとつのレジスタに収まるようにArduinoのD8~D13にしました.
この対応によって,ひとまずEthernetモジュールを操作できるようになります.
ネットワークにつながるようにする
前回のissueで操作できるようになったEthernetモジュールを使用して,ネットワークにつながるようにします.
ネットワークと言ってもLANですけど.
この対応をすることによって,以下が完成します
- 通信の土台となる部分(W5100S上にあるレジスタの読み書き)
- Ethernetモジュールの初期化(リセットとIPアドレスなどの設定)
- 同じLANにあるマシンから
ping送信するとEthernetモジュールが自動で返答する
TCPで送受信できるようにする
前回のissueでネットワークにつながるようになりましたので,ここではそれを使用してTCP接続できるようにします.
この対応をすることによって,以下が完成します
- CPUがTCPで接続を受け付けて,データ送受信できるようになる
- 自作PCはLAN内で通信を待ち受けるサーバになる.TCPの仕組みがtelnetの土台になる
今後の展望
telnetに対応します.
そして,LAN経由でシェルを操作できるようにします.
この対応が完了すれば,晴れて「自作PC」を名乗れるようになります.
通信に関する実装状況について
現在,低レイヤなどの複雑な実装は全てモジュールに任せることで妥協していますが,将来的には全部自作CPUで賄うことを考えています.
それについての説明を以下に示します.どうせ自分が覚えてられないので備忘録も兼ねています.
| 層 | プロトコル | 担う仕事 | 現在の担当 | 将来の担当(モジュールのMACRAWモード) | 将来の担当(RJ-45コネクタのみ) |
|---|---|---|---|---|---|
| アプリケーション層 | telnet | 文字のやり取り,オプション交渉(端末の設定の取り決め) | 自作(Qosmos.これから実装) | 自作(Qosmos) | 自作(Qosmos) |
| アプリケーション層 | (端末の処理) | 入力した文字のエコー,バックスペースなどの行編集 | 自作(Qosmos.これから実装) | 自作(Qosmos) | 自作(Qosmos) |
| トランスポート層 | TCP | 接続の確立と切断,再送,順序の並べ替え,流量の制御 | Ethernetモジュール(W5100S) | 自作(Qosmos) | 自作(Qosmos) |
| ネットワーク層 | IP | IPアドレスによる宛先の指定 | Ethernetモジュール(W5100S) | 自作(Qosmos) | 自作(Qosmos) |
| ネットワーク層 | ICMP |
pingへの応答 |
Ethernetモジュール(W5100S) | 自作(Qosmos) | 自作(Qosmos) |
| ネットワーク層 | ARP | IPアドレスからMACアドレスを調べる | Ethernetモジュール(W5100S) | 自作(Qosmos) | 自作(Qosmos) |
| データリンク層 | Ethernet(MAC) | MACアドレスによるフレームの送受信,誤りの検出 | Ethernetモジュール(W5100S) | Ethernetモジュール(W5100S) | 自作(FPGAの回路) |
| 物理層 | 10BASE-T,100BASE-TX(PHY) | ビット列と電気信号の変換 | Ethernetモジュール(W5100S) | Ethernetモジュール(W5100S) | 自作(FPGAの回路と外付けの受信回路.10BASE-Tのみ) |
| 物理層 | (絶縁) | LANケーブルとの電気的な絶縁 | Ethernetモジュール(RJ-45コネクタ内蔵のパルストランス) | Ethernetモジュール(RJ-45コネクタ内蔵のパルストランス) | 市販品(RJ-45コネクタ内蔵のパルストランス) |
| (モジュールとの接続) | SPI | モジュールのレジスタの読み書き,ソケットの操作(待ち受け・送信・受信の指示),フレームの受け渡し | 自作(CPUのピンをソフトウェアで操作) | 自作(CPUのピンをソフトウェアで操作) | 不要(モジュールを使わないため) |