調査を繰り返していても、設計は進まないでゲソ。 まずは第一歩、なにか作ってみればわかることもあるんじゃなイカ? まずコードを書く前におおざっぱな設計を決めるでゲソ。 このエントリは何度も書き直すかもしれないでゲソ。
Haskell/OCaml製のOSって何があるんでゲソ? でも書いたでゲソが、短時間でドッグフード可能 1 なkernelを得るには、関数型言語としてキレイな設計を考えている時間はないでゲソ。 むしろ純朴な実装で良いから、モノリシックkernelを関数型言語の設計に写像してしまった方が良いのではなイカ?
ここでは写像するモノリシックkernelとしてNetBSDを選定するでゲソ。 ソースコードが読みやすい、などの理由があるでゲソが、単にワシの趣味でゲソ。
このC言語で書かれたNetBSD kernelをいきなり型付き言語でスクラッチから書き直すのもやはりシンドイでゲソ。 もう少し楽できなイカ? そこでいきなり全部ではなく、コンパイル可能/実行可能な状態を保ちながら少しずつ型付き言語で同じ機能を再実装するでゲソ。 少しずつ型をつけていけば、 いつかは全てのコードが型付き言語で動くようになるんじゃなイカ?
この「NetBSD kernelを型付き言語で少しずつ スナッチ する」というデザインを アラフラ (Arafura)と呼ぼうと思うでゲソ。 “A”からはじまる海の名前、最初の船出にはぴったりじゃなイカ! 2 もしこの海で航海に失敗しても、今度は“B”で始まる海(デザイン)を選べばいいんでゲソ。 合言葉は“ネバーギブアップ”でゲッソ!!!
これまでの調査でjhcがMetasepiの設計に使えそうなことが判明したでゲソ。 NetBSD kernelは割り込みハンドラを作ったりしなければならないので、 もっと簡単なNetBSD bootloaderを手始めにjhcを使ってスナッチしてみるでゲソ。 何事もトレーニングでゲッソ。
NetBSD bootloaderのモジュールの構造は上図のようになっているでゲソ。 とりあえずboot2.cの中にあるコマンドラインループをjhcを使って書いてみたでゲソ。 3
import Control.Monad
import Data.Maybe
import Data.Map (Map)
import qualified Data.Map as Map
import Foreign.C.Types
import Foreign.Ptr
foreign import ccall "glue_netbsdstand.h command_boot" c_command_boot :: Ptr a -> IO ()
commands :: Map String (IO ())
commands = Map.fromList [("help", command_help),
("?", command_help),
("boot", c_command_boot nullPtr)]
command_help :: IO ()
command_help = putStr $ "\
\commands are:\n\
\boot [xdNx:][filename] [-12acdqsvxz]\n\
\ (ex. \"hd0a:netbsd.old -s\"\n\
--snip--
\help|?\n\
\quit\n"
main :: IO ()
main = do
putStrLn "Haskell bootmenu"
forever $ do
putStr "> "
s <- getLine
fromMaybe (putStr s) $ Map.lookup s commands
helpの表示はまぁいいとして、 kernelの読み込み+起動は既存コードにFFIで丸投げでゲソ。 このソースコードをイカのような方法でコンパイルしてみるでゲソ。
ほいでもってコンパイルして生成されたbootloaderバイナリをqemuで動かしてみるでゲッソ! (動画だと2:15ぐらいからMetasepi arafura版bootloaderをqemu上で起動しているでゲソ。)
うん、helpの表示とkernelの起動はできているようでゲソ。まずは実験成功でゲソ! ところでくれぐれも勘違いしてほしくないのは、 今回作ったbootloaderの99%はまだC言語製だということでゲソ。 このbootloaderの動きをシーケンス図で描いてみるとイカのようになるでゲソ。
なんと残念!かんじんの部分は既存のC言語ソースコードのままでゲソ。 でもこれから少しずつスナッチを繰り返すことで、 上図のシーケンスの多くの部分をHaskellのような型付き言語で記述することも夢ではないんじゃなイカ?
まだbootloaderのスナッチははじまったばかりでゲソ。 kernelのことはまぁ置いといて、こんな小さなモジュールをスナッチしてみるだけでも色々な課題が見えてくるでゲソ。
今年いっぱいはjhc本体の調査と平行して、 このbootloaderのスナッチは継続してやってみると色々な問題を洗い出せて面白いかもしれないでゲソ。
blog comments powered by