自作OS開発の入門書がアツい!OS自作erたちが語る、禁断の領域
引用元:https://news.ycombinator.com/item?id=43440473
osdevマジ最高っしょ。最終的に何がしたいかわかんないけど、マジで何でも作れる感じがめっちゃクール。x86の基本的な割り込みとsyscallが動いた時、マジで全てが繋がった気がしたんだよね。syscallが動き出したら、マジで世界は自分のものだよ!趣味でOSいじるの超オススメ。Rustの勉強にもなったし、マジで予想以上だった。今ではRustもそれなりに使えるし、他の誰よりもdouble faultとかtriple faultを発生させられる自信あるわ。
FPGAで自作CPUコア作って、その上でOS動かすってのはどう?(どこまでもOystersってことね)
Wirthもこれで楽しんでたみたいだよ:
http://www.projectoberon.net/
本とか参考にした?なんかRustでOS実装する本があった気がする。
https://os.phil-opp.com/
これのこと?
他にもOS開発のチュートリアルがあるよ。Rustのやつもあるよ:
https://github.com/bobeff/programming-math-science?tab=readm…
残念ながらこの本にはosdevチュートリアルによくある欠点がある。x86の細かい話ばっかりで、OS開発の話が少ない。x86の細かい話はOS開発じゃない。それは基本的なOSが扱うことのほんの一部分にすぎない。
X86以外のものをターゲットにした趣味OSのリソースがもっとあれば最高だよね。一般的ではあるんだけど、ブートストラップとかデバイスの面倒なこととか、頭に入れる必要ないじゃん。386アセンブリを手で書くのはマジでイライラするし、分かりにくいし。RISCマイクロコントローラから始めるのがオススメ。カーネルを起動して、簡単なシリアル通信をするまでに必要な知識が少なくて済むし、命令セットリファレンスとかアセンブラマニュアルとか、必要な情報が全部書いてあるデータシートもあるし。ハードウェアハッキングも楽しいし、自分で周辺機器とか作れるし。
これ、マジでイケてるね。
もしかして、これのことかな?
https://github.com/mit-pdos/xv6-riscv
昔のxv6はx86ベースで、もう公式にはメンテされてないんだよね。Xinuはどう?https://xinu.cs.purdue.edu BeagleBone(ARM)ポートがあるよ。
出来合いのUnixをいじるのは、OSを趣味にするって考えには向かないと思うな。Unixの仕組みを勉強するなら最高だけど。もし自分で作ったシステムを実験したいなら、先入観なしで、デザインを丸ごとコピーしない方がいいよ。Unix系の趣味OSなんて腐るほどあるし、実験する立場からすると、Unixのエコシステムに縛られすぎちゃうんだよね。Plan 9/9frontの方がいいかも。Bell LabsがUnixを捨てたのは、もはや研究プラットフォームとして価値がなかったから。
なるほどね。DOS/Unixじゃないオープンソースの趣味OSもいくつか知ってるけど…残念ながらVisopsysとかKolibriみたいにx86だけなんだよね。
x86以外なら、http://wiki.osdev.org/Projects を探してみるといいかも。好みに合うものが見つかるかもしれないよ。
>昔のxv6はx86ベースで、もう公式にはメンテされてないんだよね。
当然だよね。OS開発を教えるって目的に集中するためには、あのISAには対処しなきゃいけないレガシーなゴミとか醜い部分が多すぎるんだ。
例えばARMをどうやるかって話だけど:
1. まずx86でマルチタスクを動かす。ガイドがたくさんあるから。OSdevのコンセプトを学んで。
2. ARMARMを読む。何千ページもある技術資料だけど、ほとんど必要なことは書いてある。ARM osdevの良いリソースがないのは、環境が全然標準化されてないから。ARMチップは色んな場所で使われてるし、特定のボードをターゲットにすることが多いからね。
確かにね。lexingとかparsingが言語開発ガイドの焦点になってるのと同じ理由だと思う。コンパイラのほんの一部なのにね。入り口としては理にかなってるし、ある時点からはほとんど自習になるからね。
みんなSICPを崇拝してるけど、今のコンピューティングアーキテクチャとはほとんど関係ないんだよね。x86はまだ入門には良い方法なのかもね。
問題はx86が言及されてることじゃないんだ。OSにはCPU上でコードを動かす以外にも色々あるってこと。
RPC、入力スタック、グラフィックススタック、ネットワークスタック、オーディオ、プロファイリング、telemetry、スケジューリング、UI toolkits、セキュリティ、サービス管理…色々あるよね。これらを学ぶには、他のOSのドキュメントとかソースコードを読む必要があるよ。
現実世界のOSは間違いなく複雑だよね。でも初心者には、xv6で十分だと思うよ。
https://github.com/mit-pdos/xv6-public
コードベースは小さいし、ドキュメントも充実してるし、GCCをカスタムビルドしたり、dockerとか使わなくても簡単にビルドできるしね。
x86は今のコンピューティングアーキテクチャとはほとんど関係ないんだよね。あれはただのISAで、データフローに固有のパイプライン処理とかキャッシュの問題を解決する助けにはならないし。 x86マシンは安いしどこにでもあるから、ググったりネットで人に聞いたりして簡単に情報が得られるのが良いよね。 x86の細かい仕様は別に嫌じゃないな。実際に動くハードウェア上でOSを作ったり理解したりしたいなら、プロセッサとかハードウェアの細かい仕様は避けて通れないし、これはその一例として、どんな問題に遭遇してどう対処するかを示してるんだと思う。 ほとんどのOSでは、プロセッサの細かい仕様を扱うコードなんてほんの一部なんだよね。移植性の高いロジックがほとんど。DOSとかWindows 9xみたいな特殊なOSは例外かもだけど。 この本がどんなOSについて書かれたものかよく知らないけど、x86のアーキテクチャ的な側面は、多くのx86 OSにとって「標準」と見なされてる部分が多いんじゃないかな。x86、MIPS、SH-2のコード密度は、軽量RISCプロセッサに比べて高いってよく聞くし。あるいは、OSの普遍的な側面を軽く触れて、x86固有の機能に焦点を当ててるのかも。 wasmみたいなVMを使って、プレエンプションできる、マシンに依存しないユーザースペースOSを作ったら何か面白いこと学べるかな? マジで、Xerox PARCの有名なOSは全部VMベースみたいなもんだったよ。 https://github.com/rswier/swieros 俺が一番好きなOSの本は(開発より仕組みについてだけど)Operating Systems: Three Easy Pieces。HTMLとPDFで無料公開されてるけど、印刷された本も売ってるよ。 一番良いのは、古典的な論文とか資料への参考文献が付いてるところ。 UWの教授で一番好きなRemziの授業だ!最高だったな~ おすすめされて読んでみたらめっちゃ良かった! ありがとう!参考になるね! 俺も昔、自分の“OS”(ほぼBran’s Kernel Development Tutorial [1]のコピーだけど)作ったなー。システムのプログラミングとか裏で何が起こってるのか学ぶのにめっちゃ良い経験になった! マジか!俺もだ。コードなくしちゃったけど。ベアメタルで起動するのはマジで楽しかった。この本に助けられたよ。 みんなおすすめしてるけど、俺はProject Oberonが好き。2025年のコンピューティングには合わないかもしれないけど、メモリ安全なシステム言語で書かれた、ちっちゃいグラフィカルOSで、OS開発について学ぶのに十分な内容がある。 OS開発といえば、ゲームで学ぶのも面白いよね。コンピューターの歴史を旅しながらOSを学べるゲームを作りたいと思ったことがある。プレイヤーはプロセススケジューラとか割り込みハンドラになって、最初はシングルCPUのシステムから始めて、SMPシステムに成長して、最終的にはマルチシステムの分散コンピューティングプラットフォームにたどり着くんだ。 核戦争前に壊れたビンテージコンピューターを修理するために部品を集めて、マニュアルを探してプログラムを書いてクエストを解決するFallout 3/4のmodを作ろうと思ってる。 面白そうだね。アセンブリのゲームをデザインしようとしたけど、ただ「一般的なアルゴリズムをアセンブリ言語で実装する」みたいなのしか思いつかなくて。仮想ファームウェアからPCをブートストラップしてOSを書くっていうのはいいかも。 >…コンピューターの歴史を旅しながらOSを教える。プレイヤーはプロセススケジューラや割り込みハンドラーの役割を演じ、非常に限られたRAMを備えたシングルCPUシステムから開始… 日本語のOS開発本で、グラフィカルな環境まで解説してるのが2冊あるんだよねー。英語訳がマジで欲しい。[0]はMikanOS、[1]は30日OSのこと。誰かが30日OSを英語に翻訳しようとしたけど、途中で終わっちゃったみたい。[0] https://github.com/uchan-nos/mikanos [1] https://github.com/kamaboko123/30daysOS [1] https://github.com/handmade-osdev/os-in-30-days Fusion以外でここまで詳しく解説してる英語の資料ってない気がする。 Fusionの作者だよー。まだ開発諦めてないし、グラフィックサブシステムとかネットワークスタックもちゃんと作るつもり。今は効率的なゼロコピーIPCを実装しようとしてて、これができれば開発スピードも上がるはず。進捗はちゃんとドキュメントに書くから。 Nimのchannelsでメッセージパッシングをしようとしてるの?俺の場合は、コピーを防ぐためにpointersを渡すようにしてるよ。ロックを使わないように、独立したメモリー領域に書き込むようにしてるけど、一般的なパターンじゃないよね。もし何か良いパターンを見つけたら教えてほしいな。 違うよー。Nimのchannelsは同じプロセス内のスレッド間通信用で、メッセージのディープコピーが発生するんだ。Fusionのchannelsはそれとは全然違う。カーネルオブジェクトで、syscallsを使ってcreate/open/send/recv/closeする。ゼロコピーを実現するために、channel heapはuserspaceに置く必要があるけど、カーネルが管理する。POSIXのshared memoryに似てるけど、メッセージパッシングの意味合いが強いかな。Fusionはシングルアドレス空間OSだから、tasks間でpointersを直接渡せるのが強み。保護はpage table mappingsで実現してるよ。 詳しく説明してくれてありがとね!ゼロから作ってるから、機能のモデル化も自由にできるんだね。数ヶ月前にこのprojectをbookmarkしたけど、まだちゃんと理解できてなかったんだよね。ドキュメントがあるの知らなかったから、これから読んでみるよ! この本は良いよね。でもGitHubのissuesを見てほしいなー。直さないといけないところがいくつかあるんだよね。最後のcommitが10年前ってのが気になる。 activeなforkがあるよ: https://ordoflammae.github.io/littleosbook/ 2000年代のplanet-source-code.comを思い出すなー。たくさんの人がミニOSを書いて公開してたんだよね。C/C++とかAssemblyで書かれてて、Mingw32でコンパイルして、フロッピーディスクから起動してた。 リトルレッドOSブックのマニュアルはどこにあるんだ? https://en.wikipedia.org/wiki/Kylin_(operating_system) 「The Little…」シリーズってタイトル、ちょっと紛らわしいよね。もっとコメントを表示(1)
学生にx86を勧めるなんてマジでサディスティックだと思うわ。適当でいいから、もっと扱いやすいISAを選んでやれよ(intel製じゃない1990年以降のやつとか)。
仮想マシンとかエミュレーターも充実してるし。
変な仕様は286で大体終わってるから、無視しても問題ないレベル。どうしても無視できない部分は初期化処理くらい。
アセンブラとかハードウェアプログラミングを段階的に学びたいなら、DOSBoxと80年代後半~90年代前半のIDE/デバッガーの組み合わせはマジでおすすめ。Turbo/Borland PascalとかC(++)にTurbo DebuggerとTurbo Assemblerを組み合わせるとか。実行環境もあるし、ハードウェアにも直接アクセスできるし(DOSは邪魔しない)、Pascal/Cからもアクセスできるし、インラインアセンブラも使えるし、外部アセンブリファイルも使える。ステップ実行とかブレークポイントもかなり使えるし。
Raspberry Piとかも良い選択肢だと思う。ARM以外のプラットフォームは無いかな。
チュートリアルを読むと、90%くらいの時間が他の部分に比べて面白くない領域の説明に費やされてる気がする。それって全然魅力的じゃないと思うんだよね。
趣味でOS作ってて、4つのアーキテクチャ(m68k、amd64、aarch64、riscv)に移植した経験から言わせてもらうとね。今はTCP/IPスタックに取り組んでるんだけど、これがマジで楽しいし、すでに多くのことを学べた。他にも、仮想メモリとかページ置換、非同期I/O機構の設計、IPCとか、それぞれの適切な同期処理とかも面白いよね(同期処理だけでも奥が深いし、安全なメモリ再利用みたいな革新的な技術も色々あるし)。人それぞれだろうけど、俺はx86の細かい仕様よりもこういうところに興味があるな。
コンパイラがバイトコードを生成して、CPUはマイクロコードで動いてた。
だから最初のブートフェーズは、マイクロコードをCPUにロードして、それからSmalltalk、Interlisp-D、Mesa、Cedar環境を起動するって感じ。
Amiga OSの後継を目指したプロジェクトもあって、それもバイトコードベースでJITを使ってた。
>https://news.ycombinator.com/item?id=9806607
Inferno with Limboもそうだし、wasmをdisVMの代わりにするとか。
AndroidのARTとかもそうだし。
ah、IBM i (旧AS/400)もカーネル上でJITを使うバイトコードベースだね。
UNIXだけじゃないってこと。
は独自のVM(Cコンパイラ込み)を使ったクールなプロジェクトだよ。色々な機能があってびっくりした。
https://pages.cs.wisc.edu/~remzi/OSTEP/
10代の頃に作ったOSのソースコードがまだあればなぁ。MBRブートローダー作って、プロテクトモードに切り替えて、画面に文字表示して、キーボード入力できるようにしたんだよね。面白いからおすすめだよ。
[1] http://www.osdever.net/bkerndev/Docs/gettingstarted.htm
https://www.amazon.com/Developing-32-Bit-Operating-System-Cd…
https://www.projectoberon.net/
Ben Eaterの似たようなやつ(ゲーム開発ではないけど):
https://youtube.com/playlist?list=PLowKtXNTBypFbtuVMUVXNR0z1…もっとコメントを表示(2)