by shigemk2

当面は技術的なことしか書かない

UNIX V6の8086移植 #kernelvm

@7shi

UNIX V6を8086に移植して、ソフトウェアのレイヤーで必要とされる基礎を学ぶ

UNIX V6

1975年生まれ

ずっとLions本が基礎だった

  • pre K&Rという古いC言語
  • PDP-11
  • V6カーネルの大半はC言語

教材としてのUNIX V6

  • カーネルが一人でも把握できるサイズ
  • ユーザーランドまで含めるとコンパクト

ツールチェイン

  • コンパクトなコンパイラやアセンブラ
  • OS学習の一貫としてソースを追える
  • バイナリの生成過程を重視

歴史的経緯

  • 今のUNIX系OSでも活用できる知識

歴史的連続性

  • UNIXV1-7
  • 1-4BSD
  • FreeBSD
  • NetBSD
  • OpenBSD

PDP-11

  • アセンブラ入門としてのPDP-11を使用
  • UNIX V6カーネル学習ができる

でも不人気

  • 古い知識を勉強するのは興味がない?

x86の教材用OSを検討

  • MINIX xv6など、コンパイラは大規模だったり連続性がなかったりして、教材として使えるのだろうかというとかなり疑問

コンパイラ

  • ACK

結論

  • 自前でV6をx86に移植(アセンブラとコンパイラ)
  • OSやコンパイラを移植する作業を通して勉強する

  • 16bit リアルモード

  • セグメント(メモリ管理) Tinyモデル(CS=DS)
  • ユーザーでセグメントを触らない紳士協定
  • 将来的には80286のプロテクトモード

  • BIOS経由の同期アクセス

工程

  • ユーザーモードシミュレータ
  • システムコールをシミュレートするQEMUのようなインタプリタを作る(JITなし)
  • V6上で作業するのは大変なので、現在のOS上でコンパイルとかシミュレータを動かす

アセンブラのC言語化

  • アセンブラ自体がアセンブリ言語で書かれている
  • C言語に移植
  • C言語化は出来た(Xinuでそのまんまのやつが発見された)

アセンブラの8086対応

libcのトランスレート

  • システムコールのラッパー(定型処理ばかり)
  • トランスレータ(アセンブラを参考に)

コンパイラの8086対応

pre K&Rのままだけど代入演算子は修正予定

ユーザーランドの移植

カーネルの移植

  • MI(機種非依存)
  • MD(機種依存)
  • デバッグ