magoroku15氏のtwitterでxv6の存在を知りました。MITのOSの授業用にunix v6の思想を尊重してANSI Cで書き直したものでターゲットcpuはx86です。

当然ソースコードは公開されていますし、OSの仕組みを説明したドキュメントや授業の動画まで公開されています。

ドキュメントをざっと眺めてみましたが、中々分かりやすく1つのテーマが1~3ページにまとまっているため勉強のペースを作りやすいという印象を受けました。

オリジナルのunix v6を学習するには、ANSI C以前の古いC(K&R Cより古い?)で書かれていること、ターゲットcpuが既に存在しないpdp11であるというハードルがあります。古いCがANSI Cとどう異なるかの解説やpdp11のドキュメントやエミュレータ等、ハードルを低くしてくれる情報もありますが、xv6の方が自主的な勉強は進めやすい気がしてきました。

よって一旦xv6のドキュメントを最後まで勉強してみようと思います。それによりv6の思想が一通り頭に入ったところでxv6やunix v6のソースコードに挑戦してみようと思います。

Androidプラットフォーム部会?の中でmagoroku15氏のUNIX V6の解説がありました。

今日はUstreamの調子が悪く、音声が何度も途切れたりはしましたが、貴重な話が聞けて良かったです。独学では難しいところを説明するというスタンスが大変ありがたいです。

pdfの長大な資料もありますので、次回までに少しでも理解を深めておきたいと思います。

RAMにバイトアドレッシングするLB,SB命令を追加したことにより、既存のワードアドレッシングするLD,ST命令がおかしくなっていないかシミュレーションしてみました。

ST命令はRAMの奇数アドレスには書き込みをせず、正常でした。自分は書き込みをしてしまうVerilogコードになっているんじゃないかと思っていましたが、奇数アドレスへのライトイネーブル信号が、
assign we1 = st_op | sb_op & rf_b[0];
となっている意味は、
assign we1 = st_op | (sb_op & rf_b[0]);
ではなく
assign we1 = (st_op | sb_op) & rf_b[0];
の意味だったので問題ありませんでした。rf_b[0]が立っていれば奇数アドレスです。

LD命令は奇数アドレスを指定してもRAMから読み込んでしまいました。
それがPOCOの仕様なのかもしれませんが、LDだけできるのも片手落ちな気がしたので、レジスタへの書き込み信号rweにもrf_b[0]をからめることで奇数アドレスからはLDできないようにしました。

次から最後のセクション「割り込み」に入ります。