システムプログラミングのすヽめ

大学の専攻がコンピュータサイエンスでなかった筆者が3ヵ月システムプログラミングについて学んだことについてのまとめおよび紹介です。

## 使った資料

- ブログ
    - [低レイヤーの歩き方](http://rkx1209.hatenablog.com/entry/2016/12/25/141543)
- 書籍
    - [30日でできる! OS自作入門](https://www.amazon.co.jp/30%E6%97%A5%E3%81%A7%E3%81%A7%E3%81%8D%E3%82%8B-OS%E8%87%AA%E4%BD%9C%E5%85%A5%E9%96%80-%E5%B7%9D%E5%90%88-%E7%A7%80%E5%AE%9F/dp/4839919844)
    - [はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ](https://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AEOS%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0-UNIX-V6%E3%81%A7%E5%AD%A6%E3%81%B6%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF-Software-Design/dp/4774154644)
    - [プログラムはなぜ動くのか 第２版 知っておきたいプログラムの基礎知識](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B-%E7%AC%AC%EF%BC%92%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E7%9F%A2%E6%B2%A2%E4%B9%85%E9%9B%84/dp/4822283151/ref=sr_1_1?s=books&ie=UTF8&qid=1530259957&sr=1-1&keywords=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B)
    - [オペレーティングシステムの仕組み](https://www.amazon.co.jp/dp/4254127057)
    - [Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識](https://www.amazon.co.jp/%E8%A9%A6%E3%81%97%E3%81%A6%E7%90%86%E8%A7%A3-Linux%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF-%E5%AE%9F%E9%A8%93%E3%81%A8%E5%9B%B3%E8%A7%A3%E3%81%A7%E5%AD%A6%E3%81%B6OS%E3%81%A8%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E6%AD%A6%E5%86%85-%E8%A6%9A/dp/477419607X/ref=sr_1_1?s=books&ie=UTF8&qid=1530260014&sr=1-1&keywords=linux%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF)
    - [はじめて読む486―32ビットコンピュータをやさしく語る](https://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E8%AA%AD%E3%82%80486%E2%80%9532%E3%83%93%E3%83%83%E3%83%88%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%92%E3%82%84%E3%81%95%E3%81%97%E3%81%8F%E8%AA%9E%E3%82%8B-%E8%92%B2%E5%9C%B0-%E8%BC%9D%E5%B0%9A/dp/4756102131)
    - [Linuxカーネル2.6解読室](https://www.amazon.co.jp/Linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB2-6%E8%A7%A3%E8%AA%AD%E5%AE%A4-%E9%AB%98%E6%A9%8B%E6%B5%A9%E5%92%8C/dp/4797338261/ref=sr_1_1?s=books&ie=UTF8&qid=1530260086&sr=1-1&keywords=linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB2.6%E8%A7%A3%E8%AA%AD%E5%AE%A4)
    - [BareMetalで遊ぶ Raspberry Pi](https://tatsu-zine.com/books/raspi-bm)
    - [コンピュータの構成と設計 第5版 上](https://www.amazon.co.jp/dp/4822298426/) (途中まで)
    - [UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI](https://www.amazon.co.jp/UNIX%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%80%88Vol-1%E3%80%89%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AFAPI-%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88%E3%81%A8XTI-W-%E3%83%AA%E3%83%81%E3%83%A3%E3%83%BC%E3%83%89-%E3%82%B9%E3%83%86%E3%82%A3%E3%83%BC%E3%83%B4%E3%83%B3%E3%82%B9/dp/4894712059/ref=sr_1_1?s=books&ie=UTF8&qid=1530260268&sr=1-1&keywords=unix%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0) (途中まで)
    - [Unix考古学 Truth of the Legend](https://www.amazon.co.jp/Unix%E8%80%83%E5%8F%A4%E5%AD%A6-Truth-Legend-%E8%97%A4%E7%94%B0-%E6%98%AD%E4%BA%BA/dp/4048930508/ref=sr_1_1?s=books&ie=UTF8&qid=1530260313&sr=1-1&keywords=unix%E8%80%83%E5%8F%A4%E5%AD%A6)
- Raspberry Pi
    - [「30日でできる！OS自作入門」のHaribote OSをラズベリーパイに移植してみた](http://uzusayuu.hatenadiary.jp/entry/2017/02/12/064131)
    - [Baking Pi – Operating Systems Development](http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/)
    - [Building an Operating System for the Raspberry Pi](https://jsandler18.github.io/)
    - [Raspberry-Pi Bare Metal Tutorial](https://github.com/BrianSidebotham/arm-tutorial-rpi)
- 書いたもの
    - [【日記】30日でできる！ OS自作入門](http://kentakudo.hatenablog.com/entry/2018/03/31/225753)
    - [Raspberry PiでLチカ](http://kentakudo.hatenablog.com/entry/2018/05/26/223303)
    - [【Raspberry Pi】システムタイマ](http://kentakudo.hatenablog.com/entry/2018/05/28/214314)
    - [Hello, world](https://medium.com/what-i-talk-about-when-i-talk-about-technology/hello-world-36a3488c5604)
- その他
    - [Turing Complete FM](https://turingcomplete.fm/)

## おすすめ

### [低レイヤーの歩き方](http://rkx1209.hatenablog.com/entry/2016/12/25/141543)

すでに有名な記事ですが改めて紹介します。Turing Complete FMにも度々登場しているるくすさんの記事で、システムプログラミングについて学ぶ際の道しるべとなるものです。低レイヤーの概観と、それぞれどのように学習を進めていけばいいかがイメージできるようになります。(記事中には「ロードマップではなく辞書のようなもの」との但し書きがあります。実際3ヵ月間タブを開きっぱなしで事あるごとに参照していました。)この記事に背中を押されたのが今回システムプログラミングを学ぶきっかけでしたし、「よしがんばろう」と勇気付けてくれるブログなのでぜひ一読オススメします。

### [30日でできる! OS自作入門](https://www.amazon.co.jp/30%E6%97%A5%E3%81%A7%E3%81%A7%E3%81%8D%E3%82%8B-OS%E8%87%AA%E4%BD%9C%E5%85%A5%E9%96%80-%E5%B7%9D%E5%90%88-%E7%A7%80%E5%AE%9F/dp/4839919844)

ずっと気になっていた通称OS自作本です。本書の方針にある通りOSの仕組みや一般的な機能の説明は最小限に必要な知識だけを都度学んでいくため、体系的な知識を得ることはできませんが、OS開発を体験してみるという意味でとても貴重な本だと思います。解説は「中学生にもわかるように」の言葉通りとても丁寧で読みやすいです。一部理解に詰まる部分もありましたが、読み進めるあるいは他書に触れた後読み返すに従い徐々にわかるようになったので、筆者の言う通りわからないところがあってもとりあえず先に進むのがコツです。
またあとがきが非常に印象的でした。これからの展望––ツールチェインの移植からセルフホストまで––は読んでいてワクワクしましたし、OS開発の心得、とりあえず書いて動かして後から直すあるいは最初から書き直す、といったスクラップ&ビルドの精神は金言として心にとめておこうと思いました。
macOSでの開発環境を整える際に目にした[三等兵さんのブログ](http://d.hatena.ne.jp/sandai/20120728/p2)も読んでいて面白かったのでオススメです。

### [「30日でできる！OS自作入門」のHaribote OSをラズベリーパイに移植してみた](http://uzusayuu.hatenadiary.jp/entry/2017/02/12/064131)

OS自作本を進めていくうちになにか形になるものを作りたいという気持ちが膨らんできました。Raspberry Piを使えば何か面白いことができるんじゃないかと思い立ち、調べたところ出会ったのがこの記事です。OS自作本のHariboteOSをRaspberry Piに移植したという内容で、参考にした資料から実際に必要だった変更まで詳しくまとめられています。またアーキテクチャの違いをどう吸収したかという技術的な詳細も別記事にまとめられており、とても勉強になりました。
実際にRaspberry Piを入手して各種チュートリアルを試したり最終的な目標として「[xv6](https://github.com/mit-pdos/xv6-public)のRaspberry Pi移植」を目指したものの、結果としては挫折、というか全然形になるところまで行けませんでした。しかしOSがどういう要素で構成されるのか、どのように起動するのか、ハードウェアを制御するのがいかに大変か、といったことを実際に手を動かして学ぶことができたので挑戦した甲斐はありました。苦労してやっとディスプレイに"Hello, world"が表示された際の感動はなかなかのものです。

### [Unix考古学 Truth of the Legend](https://www.amazon.co.jp/Unix%E8%80%83%E5%8F%A4%E5%AD%A6-Truth-Legend-%E8%97%A4%E7%94%B0-%E6%98%AD%E4%BA%BA/dp/4048930508/ref=sr_1_1?s=books&ie=UTF8&qid=1530260313&sr=1-1&keywords=unix%E8%80%83%E5%8F%A4%E5%AD%A6)

最後にこちらの本。2年前に出版された際に一度読みましたが、出てくる用語が全くわからなかったため「これはいずれ読み返そう」と寝かせておいた経緯があります。今回各書籍をバラバラにそして立て続けに読んだことの弊害として、時代順がこんがらがってしまうということがありました。最後にこの本に再挑戦することでリベンジを果たすとともに、OS(UNIX)の歴史・時代背景からWintel時代への流れを掴み、学んだ知識を整理することができました。

## システムプログラミングを学ぶことの効能

最後にシステムプログラミングを学んで良かった点をいくつか紹介します。

- **情報収集の守備範囲が広がる**

例えばTuringComplete FM。システムがメイントピックのポッドキャストです。もちろん全て理解できるようになった訳ではありませんが、少なくともついていける、最後まで興味を失わずに聞くことができるようになった、という意味で進歩したなと感じます。また、これまで理解できずにタブを開いたもののスクロールだけして閉じてきたニュースにもついていけるようになり、全く新しい分野から情報がとれるようになったのは非常に大きなメリットだと感じています。

- **基礎を身につければ素早く最新の技術へのキャチアップができる**

これはいろんな場所で見聞きしたことがあり、今回システムの勉強をするに至った動機の一つでもあります。今のところ「まだわからない」というのが本音です。少なくとも実感はまだはありません。たった3ヵ月の表面を引っ掻いただけの勉強では足りないのかもしれないし、まだ学びたてでちゃんと最新技術をキャッチアップする機会がきてないだけかもしれません。これから検証していこうと思います。

- **システムプログラミングは楽しい**

もちろん主観的なものですが、システム関連の知識を得ること、実際にコードを書いてハードウェアを動かすことはとてもエキサイティングでした。これまでどういう理屈で動いているのかわからなかった部分がクリアになり、学習する以前にも増して興味が深まったように感じます。コンパイラなどまだ触れていないトピックがたくさんあるのでまだまだ興味が尽きることはなさそうです。

---

ということで「すヽめ」と言いながら説得できるだけの根拠だったかどうか怪しいですが、はっきり言えるのは「システムの勉強楽しかったよ」ということであり、るくすさんの記事と同様に、誰かの背中を押せれば大変嬉しいです。