uchan note

プログラミングや電子工作の話題を書きます

OS自作ゼミの紹介 - セキュリティ・キャンプ全国大会 2022

このページはセキュリティ・キャンプ全国大会 2022 の開発コース「OS 自作ゼミ」の紹介ページです。 参加費無料で講義を受けることができますので、22 歳以下の方は是非応募してください。

OS 自作ゼミ 基本情報

OS 自作ゼミの基本的な情報は以下の通りです。

  • イベント:セキュリティ・キャンプ全国大会 2022
  • コース:開発コース
  • ゼミ:OS 自作ゼミ
  • 必要機材:PC、その他必要に応じて仕様書や参考書など
  • 事前学習:あり(詳しくは後述)
  • 講師:hikalium、内田
続きを読む

OS自作入門の出版を振り返る

この記事は 自作OS Advent Calendar 2021 の 4 日目の記事として書かれました。

人生の一大事

今年は私にとって大きな出来事がありました。それは出版と結婚です。この記事では前者について述べます。

2021 年 3 月に ゼロからの OS 自作入門 を出版しました。 OS 作りに関する知識が無い状態から始めて、30 章かけて OS を手作りするという本です。 この本の出版に際して書いたブログ記事はこちらです 『ゼロからのOS自作入門』に込めた思い - uchan note

f:id:uchan_nos:20211204103344p:plain
ゼロからのOS自作入門の表紙画像

この本は約 3 年の執筆・開発期間を費やした書籍です。 人生の短くない時間を捧げたものなので、大きな愛着があります。

この執筆に際し、MikanOS という OS を自作しました。 今まで、OS をちょっと作っては飽き、また再燃してはじめから作り直しては飽き、を繰り返していた私がここまでの完成度の OS を作り上げることができたのは、本を出すという目標があったからこそでした。

売れ行き

出版から今までの売れ行きはお陰様で好調で、紙版が現在第 3 刷です。

ニッチな分野の技術書としてはとても売れている方ではあると思いますが、ライバル書よりは低いです。 勝手にライバル視している「30 日でできる!OS 自作入門」ですが、何と、2006/2/28 の出版から 2 ヶ月も経たない 4/13 の時点で第 4 刷になっているのです。 そして 2008 年には 12 刷、2019 年には 23 刷になっています。凄すぎますね。 増刷スピードもそうですが、10 年以上の長きに渡って人々に必要とされているのも大変尊敬します。

刷数がライバル書より伸びないのは、ある程度は割り引いて考える必要があります。 2006 年にはライバル書の電子版は無く、紙版でしか供給されません。 一方、「ゼロからの OS 自作入門」は電子版もあります。 電子版はいくら売れても刷数には影響を与えませんから、同じ販売部数であれば必然的に刷数に差が出ます。

少しジャンルは違いますが、同系統の本である「CPU の創りかた」は 2020 年 11 月の時点で 31 刷であることを確認しています。 2003 年に出版されてから 17 年、売れ続けているわけです。脱帽。

uchan のこれから

「ゼロからの OS 自作入門」の目的は、多くの人に OS 作りの楽しさを味わってもらい、あわよくば低レイヤの世界に興味を持って足を踏み入れていただきたい、というところです。 この思いはもちろん今も抱き続けていて、今年 8 月~10 月に開催されたセキュリティ・キャンプ全国大会 2021 でも「OS 自作ゼミ」を引き続き担当しました。 また、毎週土曜日夜の「MikanOS もくもく会」(今は「雑談会」という名目でやってますが、MikanOS 関連の質問は大歓迎です)も継続しています。

一方、書籍を書き上げ、私の中では「OS の自作」には一定の満足感というか、やりきった感が芽生えたのも事実です。 私が「OS の自作」という概念に触れる前は電子工作(マイコン回路とプログラミングを主体として)をやっていたのもあり、 今はちょっと OS の自作を離れ、電子回路、あるいは CPU といったところを探検しようとしています。

f:id:uchan_nos:20211204105402j:plain
FPGAで作った任意波形発生器

これは OS とおさらばするという意味ではありません。 むしろ、OS をより深く理解する、より面白くするために、OS よりも下にあるハードウェアを探求しようということです。 どんどんと下に潜っていて、底なし沼のようです。 将来的には MikanOS を自作 CPU で動かしてみたいです。 あるいは、OS だけでは実現できない機能を自作の電子回路と OS を組み合わせることで実現するのも面白そうですよね。

OS を作っていると様々なデバイスを制御するわけですが、それらはレジスタ、あるいは IO ポートという、デジタル信号の世界で制御できるようになっています。 あたかもメモリを読み書きするかのようにデバイスを制御できます。 OS は、レジスタインターフェースの先がどのように実現されているかは気にせず、仕様通りのコマンドをレジスタに書けば、あとは裏に控えた電子回路がうまく処理してくれます。

逆に言えば、OS を作っているだけではレジスタの先にどんな回路があるのかが分からないということでもあります。 「OS を自作するとコンピュータ全体を支配することができる」という旨のことを時々言っていますが、これは半分嘘です。 全体的な支配はできるけれども、レジスタから先(末端の部分)は支配できないからです。 レジスタに書かれたコマンドをどうやって実行するかは、そのデバイス自身が決めることであり、OS は手が出せないのです。

ということで、最近の uchan は電子回路に関する発言が多めになっていますが、いずれ、OS に戻ってくるときがあるでしょう。 OS の自作に興味を失ったわけではないので、自作 OS 関連で何かあれば、気軽に話しかけていただいて構いません。 (もちろん電子工作の話題も歓迎です。)

タイガーブックを読む:LR(0)構文解析は先読みするのか

最新コンパイラ構成技法(原題「Modern Compiler Implementation in ML」、通称「タイガーブック」)の「3.3 LR 構文解析」の節を読んで理解したことをメモする記事です。 シリーズぽい記事タイトルですが、シリーズにする予定は今のところありません。

続きを読む

KiCad + FlatCAM で KitMill 用の基板切削データを作る

KitMill CL200(あるいは CL100/CL420)で基板切削をするための CNC プログラム(KitMill を制御するデータ)を作る手順のメモです。

f:id:uchan_nos:20210620222039j:plain
実験的に切削した基板(導体面)

記事はこちらに移動しました KiCad + FlatCAM で KitMill 用の基板切削データを作る | elchika

GCC 11のビルドとldconfig

GCC 11 をソースコードからビルドする方法と、GCC 11 に付属する標準 C++ ライブラリを利用するための ldconfig コマンドを紹介します。

GCC 11.1.0 のビルド

基本は Build GCC 11 from source on Ubuntu と同じ手順で OK です。 Ubuntu 18.04 と 20.04 でビルドできることを確認しました。

GCC はソースディレクトリでの ./configure に対応していませんので、ソースディレクトリ以外にビルド用ディレクトリを作ります。 この記事では次のようなディレクトリ構成にしていますね。

$HOME/
  gcc-releases-gcc-11.1.0/
    configure
    contrib/download_prerequisites
  build/

私は gcc-releases-gcc-11.1.0/build という感じでビルドディレクトリを作りましたが、上手くビルドできました。

ビルド設定は次の通りとしました。

../configure --prefix=/usr/local/gcc-11.1.0 --enable-languages=c,c++ --disable-multilib --program-suffix=-11.1

--prefix はインストール先ディレクトリを指定します。上記のように指定すると /usr/local/gcc-11.1.0/bin/ 以下にコンパイラgcc や g++ など)が、/usr/local/gcc-11.1.0/lib64/ 以下に C++ 標準ライブラリがインストールされることになります。

--enable-languages で必要な言語を選択します。先の記事では fortran も指定していましたが、私は使わないので。少ないほどビルドが早く終わります。

--disable-multilib を指定しない場合、次のエラーが発生しました。

collect2: error: ld returned 1 exit status

configure: error: I suspect your system does not have 32-bit development libraries (libc and headers). If you have them, rerun configure with --enable-multilib. If you do not have them, and want to build a 64-bit-only compiler, rerun configure with --disable-multilib.

GCC はデフォルトで、32 ビットおよび 64 ビット向けバイナリを生成する機能を持ちます。 しかし、32 ビット向けバイナリを生成する機能を有効にするためには、システムに 32 ビットバージョンのライブラリ(libc など)がインストールされている必要があります。 手元のマシンには 32 ビット版のライブラリ群がインストールされておらず、また、64 ビット向けのビルドだけできれば当面は困らないので、 --disable-multilib を付与することとしました。

--program-suffix=-11.1 は、ビルドされた実行ファイルのサフィックスを指定します。例えば g++-11.1 のような名前になります。

ldconfig

make と make install を実行すると /usr/local/gcc-11.1.0/bin/ 以下にコンパイラがインストールされます。 後はここにパスを通すだけでいいかな、と思うと、実はそれでは不十分というお話です。

結論としては /etc/ld.so.conf.d/ 以下に設定を置いて sudo ldconfig を実行しましょうね、ということです。

共有ライブラリ

g++-11.1 でとあるプログラムをビルドし、実行しようとしたところ、次のようなエラーが表示され、実行できませんでした。

$ ./opelac
./opelac: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by ./opelac)

C++ 標準ライブラリの新しめの機能を使うと表示されるのだと思います。 試しに strings /lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX_ としてみると、3.4.28 までしか含まれていないことが分かりました。

実行ファイルが利用する共有ライブラリは ldd で確認できます。

$ ldd opelac
./opelac: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by ./opelac)
        linux-vdso.so.1 (0x00007ffd51fde000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f0266d6c000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0266c1d000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f0266c02000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0266a10000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f0266f57000)

確かに opelac(g++-11.1 でビルドしたやつ)が libstdc++.so.6 という名前で /lib/x86_64-linux-gnu/libstdc++.so.6 を参照することが分かります。 新しいコンパイラGCC 11)でビルドした実行ファイルが、実行時にシステム標準の古いライブラリを参照してしまっているわけです。 これがエラーの原因ですね。

先ほどインストールした GCC 11 に含まれる libstdc++ を利用するようにすれば解決します。

やり方はいくつかあります。1 つは LD_LIBRARY_PATH という環境変数にライブラリファイルがあるディレクトリを設定してから opelac を実行することです。

$ LD_LIBRARY_PATH=/usr/local/gcc-11.1.0/lib64 ./opelac

共有ライブラリを一時的に差し替えてプログラムを動作させる場合にとても便利なやり方です。 ただ、毎回 LD_LIBRARY_PATH を指定しなければならず、面倒です。 恒久的に LD_LIBRARY_PATH を設定しておくには $HOME/.bashrc 等に設定を記載してください。 $HOME/.profile では LD_LIBRARY_PATH を設定できませんので注意してください。 参考 LD_LIBRARY_PATH を設定しても反映されないことがある

もう 1 つのやり方は環境変数ではなく、ld の設定ファイルを調整する方法です。 この方法はシステム全体に影響を及ぼすことができます。

$ cat /etc/ld.so.conf.d/gcc-11.1-lib64.conf
/usr/local/gcc-11.1.0/lib64
$ sudo ldconfig

こんな感じで、ライブラリの置き場所を書いたテキストファイルを配置し、ldconfig コマンドを実行するだけです。

この設定を行うと、特にシステム再起動などせず、すぐに参照先ライブラリが切り替わります。ldd で確認してみます。

$ ldd opelac
        linux-vdso.so.1 (0x00007ffffca3b000)
        libstdc++.so.6 => /usr/local/gcc-11.1.0/lib64/libstdc++.so.6 (0x00007efcbd7ce000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007efcbd67f000)
        libgcc_s.so.1 => /usr/local/gcc-11.1.0/lib64/libgcc_s.so.1 (0x00007efcbd664000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007efcbd472000)
        /lib64/ld-linux-x86-64.so.2 (0x00007efcbd9f0000)

libstdc++.so.6 の参照先が変わっていることが分かると思います。 これで、opelac コマンドがエラー無く動作するようになりました。

OS自作ゼミの紹介 - セキュリティ・キャンプ全国大会 Yトラック

このページはセキュリティ・キャンプ全国大会 2021 の集中コース「OS 自作ゼミ」の紹介ページです。 参加費無料で講義を受けることができますので、22 歳以下の方は是非応募してください。

(本記事は随時更新するかもしれません。特に 4 月中は更新頻度が高いことが予想されます。時々見に来てくださると嬉しいです。)

OS 自作ゼミ 基本情報

OS 自作ゼミの基本的な情報は以下の通りです。

  • イベント:セキュリティ・キャンプ全国大会 2021 オンライン
  • トラック:システムソフトウェア自作トラック
  • ゼミ:OS 自作ゼミ
  • 必要機材:PC、その他必要に応じて仕様書や参考書など
  • 事前学習:あり(詳しくは後述)
  • 講師:怒田さん、hikalium さん、内田
続きを読む

『ゼロからのOS自作入門』に込めた思い

2021 年 3 月 22 日に『ゼロからの OS 自作入門』を出版する予定です。 本書は OS を手作りする本で、現代のパソコンでちゃんと起動する点が特長です。

15 年前の 2006 年に出版された『30 日でできる!OS 自作入門』を読んで育った私(uchan)が その後継となるだろう本を書いたということで、執筆の裏話を記してみたいなと思います。

続きを読む