-
Notifications
You must be signed in to change notification settings - Fork 10
rocasfero; home
@rocasfero(ろかすふぇろ、ろか)と申します m(_ _)m
本職はプログラマではないのですが、業務上でごく簡単なツールやサービスを作ったり、休日に趣味で個人開発やプログラミングの勉強したりするレベルの者です。
もっぱらフロントエンド(Node.js/Vue/Nuxt/Typescript とか)辺りをうろうろしてましたが、突如として低レイヤーに興味がわき、学生時代に勉強した C の知識を頼りに本書を読んでおります。
一方で、自作キーボードなどにも手を出しておりマイコンにも触る機会があったりするので、将来的には組み込み分野の勉強にも手を伸ばしたい所存です。
どうぞよろしくお願いします!
M1 Mac の環境で x86_64 の OS にチャレンジしたいと思った理由。
- せっかくマシンを新調したんだからとことん使ってやりたい
- セルフよりクロスコンパイルの方が面白そう(OS だけでなく CPU アーキテクチャの壁も越えてみたい)
- 開発人口の少ない環境のほうが試行錯誤での学びが多そう
USB メモリ用意するのマンドクセ('A`)検証用の実機 PC 用意するのマンドクセ('A`)いちいち再起動させるのマンドクセ('A`)
という背景から、AppleSilicon 環境単体で自作 OS 本を勉強する道を模索しています!
項目 | 詳細 |
---|---|
マシン | M1 MacBook Pro / RAM 16GB / macOS Big Sur 11.2.3 |
ターゲット | QEMU x86_64 (野良ビルド) |
ビルドツール | llvm@11 (homebrew) |
エディタ | VSCode@1.55 |
M1 Mac 環境で学習を進めるにあたり、躓いた部分を個人 Blog としてまとめているもののうち、特にポイントだと思う部分を抜粋してご紹介します。
気になるトピックがありましたらぜひ記事リンクから飛んでみてください。
なお、再現性を確認できるように手順を細かくメモしているつもりですが、動作保証するものではありませんので、どうぞお察しください!
この回では、x86_64 の OS を実行するための仮想環境(QEMU) を用意しました。
2021 年 03 月末時点では、AppleSilicon 上で x86_64 OS が動作する QEMU が提供されていないので、ソースにパッチを当てて野良ビルドすることにしました。
この回では、ビルドツールとして homebrew から llvm@11 をインストールしました。
公式の環境は x86-64/Ubuntu/llvm@7 ですし、他の Mac ユーザー (Intel/AppleSilicon)は llvm@9 で開発を進めている方が多い?ようですが、 私はあまり深く考えずに homebrew 対応されている llvm@11 を使って学習を進めることにしました(笑)。
この回では、UEFI の SDK である EDK II をインストールしました。
開発母艦が macOS ということで、ツールチェインのタグ指定を CLANG38
→ CLANGPDB
として設定していきます。
この回では、実際に C 言語で書いたカーネルをブートローダーから呼び出すことになります。
しかしながら、llvm@10 以降からリンク後のバイナリサイズ削減のため ELF のセクション間のゼロ埋めを省略する動作がデフォルトとなり、 本書通りのコマンドでは想定する動作にならない事がわかりました。
そのため、リンカに -z separate-code
のオプション を付与して llvm@9 以前と同等のバイナリを得ることで期待する結果を得ることが出来ます。
加えて、EDK II もツールチェインタグを CLANGPDB
としているため、カーネルのエントリポイントに対して SystemV AMD64 ABI 方式で引数を渡せるように
専用のマクロをブートローダー側の関数呼び出しに組み込む必要がありました。