Linux
UNIX
OS
低レイヤ

低レイヤーを学ぶための技術書をまとめてみる

半年前から低レイヤーに関する勉強をしている。
その中で読んだ技術書の感想、そしておすすめの読む順番をここにまとめてみる。

OS

30日でできる! OS自作入門

おすすめ度:60(満点100)
一言:非エンジニアに向けたOS自作本

この本は全体的に「やわらかい説明」と「とりあえず書いてみよう」という流れで進んでいく。どちらかというと非エンジニア(もしくはプログラミングを初めて数ヶ月の人)向けの本。自分としては、あまり詳しく説明されないまま進められていく感触が好きではなかった。少し物足りなさを感じる本ではあるが、後述していく本に挫折してしまったのなら読んでみる価値はある。

コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方

おすすめ度:95
一言:一からOSを作って学べる本格的な指南書

論理回路と呼ばれるレベルからメモリやCPUを作っていき、アセンブリ言語やアセンブラの開発、そして独自言語とそのコンパイラ、OSまで開発する。CPUなど各要点の考え方や理論を紹介し、そして自分で考えて実装するという内容になっている。本の題材はnand2tetrisという海外の授業でも使われているものであり、解答のコードはGitHubで探せばいくらでもある。つまづいた時は誰かのを参考にしてもいいし、自分で悩みに悩み抜いて解決するのもいい。コンピューターの全体像を把握するには相当良い本だと思う。エンジニアが低レイヤーを勉強するときの一冊。

本の内容については私のブログにまとめている。「コンピュータシステムの理論と実装」を要約する | MyCode.rip

CPUの創りかた

おすすめ度:65
一言:物理的にCPUを創りたいのなら良い本

この本では、実際にパーツを用いながらCPUを構築していく。「コンピュータシステムの理論と実装」ではハードウェア記述言語を使ってハードウェアをコードとして表現するため、実際のハードウェアについては全く触れていない。そのためハードウェアに興味が湧いているならこの本が適している。ただ先の本が優秀すぎたため、これを読んでもさらにCPUを理解できる、というわけではない。ハードウェアについて理解を深めたいならいいが、ソフトウェアエンジニアの自分としては「飛ばしてもいい」という本。またパーツは別途自分で用意する必要があるので注意。

Go言語でつくるインタプリタ

おすすめ度:70
一言:Goでインタプリタ言語を作る技術書

GolangでTDD(テスト駆動開発)をしながらインタプリタ言語を開発する本。インタプリタ言語とはJavaScriptやPHPのような、コードを実行時に解析して実行する言語のことである。自分はGoの勉強がてらにと買ったが、Goの学習用途としては向いていない。あくまで言語開発のための字句解析・構文解析器などについて学ぶ本である。理論自体は「コンピュータシステムの理論と実装」と変わりないため、こちらもまたさらに理解を深めるといった用途としては少し微妙になる。Golangを使って何か開発したい人、GolangでTDDを実践したい人、もう一度言語を開発したい人向けの本になる。

はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ

おすすめ度:85
一言:Linuxの元であるUnixを丁寧に解説した技術書

Linux(v4.1)は2100万行ものコードがあり、いきなり理解するにはあまりにもハードルが高い。ということで、Unix V6という1万行にも満たないOSを丁寧に解説しているこの本が役に立つ。Unixは最新のOSのほとんどの起源となっているOSのこと。Linuxのようにマルチスレッドなどの高機能を持ってはいないが、プロセスの基本的な管理方法などはほとんど同じである。そのためLinux理解への一歩として非常に参考になる。自分もまだ読んでいる最中だが、かなり良い技術書。

詳解UNIXプログラミング 第3版

おすすめ度:65
一言:Unixをさらに追っていきたい人向け

上記の「はじめてのOSコードリーディング」をもう少し詳しく追っていきたいという時の本。ただ先の本を読まず、いきなりこの本を読んでもあまり理解できない。あくまで補助的に、もう少し深くといったユースケースになる。

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

おすすめ度:95
一言:Linuxのおいしい所を分かりやすく解説している技術書

正直この本を一番最初に読んでもいいかも知れない。コードをほとんど使わず、図を使って解説しているため、非エンジニアでも理解できるほど丁寧に解説している。それでいてLinuxに関する知識を浅すぎず、深すぎずで解説しているので非常にためになる。「低レイヤーはあまり興味ないけど、Linuxの重要な部分だけ把握しておきたい」という人にも最適である。

詳解 Linuxカーネル 第3版

おすすめ度:55
一言:Linuxをある程度理解している人向けのリファレンス本

2005年頃にリリースされたLinux v2.6について解説した超分厚い技術書。上で紹介した本を全て読んでから挑んでも、ほぼ挫折してしまうレベルの本。Linuxをある程度理解している人がリファレンス的に読む用だと思う。10年以上前にリリースされたバージョンなので所々今とは違う解説がされているのは注意が必要。ただ55点という点数はあくまでこの記事における点数であり、技術の結晶が詰まった良書であることは間違いない。個人的には第4版を待望中。

その他(OS以外)

ここではOSに関する本ではないが、低レイヤーとして挙げられるものを紹介する。

マスタリングTCP/IP 入門編 第5版

おすすめ度:95
一言:ネットワークについて体系的に学べる良技術書

ネットワークについて学びたいならこれ一択、というレベルでおすすめできる。ネットワークとは何かというレベルから、TCP/IP周辺の知識を体系的にまとめている。例えば、Dockerのネットワーク周りがよく分からないという課題を持っている人も、これを読めば難なく理解できるようになる。新しいプロトコルが出た時や、サーバーのミドルウェアに関わる時など、そういった時にも役立つ知識が詰まっている。

プログラマのための文字コード技術入門

おすすめ度:90
一言:文字コードについて体系的に学べる良技術書

この本は文字コードを歴史とともに分かりやすく解説している。Unicodeとは何か?UTF-8,UTF-16の違いは何か?といった知識を体系的に把握しておくほど、問題に当たっときスムーズに解決しやすい。例えばPython2と3の文字の扱いなど、低レイヤーに関わらずともアプリケーションエンジニアにも非常に役立つ知識である。2018年12月に新改訂版が出版。

この本についてもブログにまとめてある。「プログラマのための文字コード技術入門」を要約したのでメモ | MyCode.rip

プロフェッショナルSSL/TLS

おすすめ度:80
一言:SSL/TLSの基礎やセキュリティを学ぶための技術書

SSL/TLSの基礎や、攻撃方法とその対策をまとめている本。基礎的な説明の他にも、OpenSSL、Apacheなどの各サーバーの設定方法などを説明している。特にセキュリティ周りはかなり専門的な箇所までまとめられており、相当な読み応えがあるが、セキュリティエンジニアを目指していない人には少々オーバーに感じるかもしれない。しかしエンジニアとしては、基礎的な部分(ハンドシェイクや暗号化の種類)だけでも最低限知っておきたい。

こちらもブログに基礎編をまとめている。プロフェッショナルSSL/TLSの基礎編をまとめてみる | MyCode.rip

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

おすすめ度:80
一言:アルゴリズムの基礎から応用まで実装することができる技術書

普段から高級言語を使用している場合はあまり意識しないが、低レイヤーでは時として自分が数学操作などを実装しなければならない。そういった時に計算量を意識して実装するにはアルゴリズムが必要になる。この本ではC++をサンプルコードとして、AIZU ONLINE JUDGEの問題を解説している。基礎的なソートアルゴリズム、データ構造、探索アルゴリズムは全てこの本で学べる。

例によってこちらもブログにまとめている。「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造」の基本編をまとめてみる | MyCode.rip

世界でもっとも強力な9のアルゴリズム

おすすめ度:85
一言:アルゴリズムの実用例を楽しく学べる本

こちらは低レイヤーとは少し離れてしまうかも知れないが、非常に面白い本だったので紹介する。この本は検索エンジンの基本的な仕組み、公開鍵暗号、誤り訂正符号、データ圧縮など、身近にあるもののアルゴリズムを解説している。これらのアルゴリズム知識を知っておくと、身近にある課題を解決するための手がかりになるかも知れない。読み物としても非常に推せる本。

まとめ

以上が自分が低レイヤーを学んできた際に読んできた本の紹介になる。

まだLinuxと仮想化技術についてどう学べばいいか全然分からないため、誰か参考になる書籍やサイトを知っている方がいれば教えて欲しい。お願いします。