3. 自作プロトコルスタックの移植(前編)
ここから自作プロトコルスタックのコードをxv6に移植していきます。作業量が多いため前編と後編にわけており、前編ではNICから読み取ったパケットをプロトコルスタックの受信キューに格納してソフトウェア割り込みを発生させるところまで進めます。
移植は「micropsのコードをcpでコピーして、必要な箇所だけ修正する」というスタイルで進めます。2.5で用意した簡易libcのおかげで、#include <stdio.h>のようなシステムヘッダのインクルードもそのままコンパイルが通るため、本体のコードはほとんどそのまま利用できます。修正が必要になるのは次の2種類だけで、該当するモジュールの節で差分を示します。
Important
本体のコードに加える修正は下記の2種類だけです。
未移植モジュールの初期化処理のコメントアウト(
net.c)
- 1モジュールずつ移植していく都合上の一時的な措置
- 各モジュールの移植が完了するたびにコメントを解除していきます
送信バッファのサイズ上限の縮小(
ip.hのIP_TOTAL_SIZE_MAX)
- 各層は送信パケット構築用のバッファをローカル変数(スタック)に確保します
- 2.4でカーネルスタックを拡張しましたが、
IP_TOTAL_SIZE_MAXの本来の値(UINT16_MAX= 約64KB)はそれでもスタックに載りません- Ethernetで一度に送れるのはMTU(1500バイト)までなので、この値に縮めます
プラットフォーム固有の処理(メモリ・ロック・割り込み・ドライバなど)は本体と分離してあるので、xv6向けの実装をplatform/xv6-riscvの下に追加していきます。