低レイヤーの入り方

# はじめに

低レイヤーの入り方とか偉そうなこと言ってるんですが自分は最近、低レイヤーの沼に足のつま先が浸かった程度です。また、本格的にプログラミングも初めて1年半しか経ってません。ですが、自分みたいに低レイヤーに入りたいけど入り方が分からない人のために少しでも自分がやってきたことが道しるべになってくれたらと思い記事を書いてみることにしました。

2ヶ月半ほどの期間になります。

流れとしては
基本情報の本 → プログラムはなぜ動くのか → コンピュータシステムの理論と実装 → 本・ネットにあるOSに関連する論文や資料 → カーネルモジュール → キャラクタデバイス開発

# 基本情報の本

最初に、低レイヤーをする前に一旦知識を広く浅く確保しようと思い基本情報の本をする事にしました。昔、何周かしていたのですが忘れていたのでもう一回見直す事にしました。
やはり、基本情報は自分的には低レイヤーに入る取っ掛かりになると思うので資格獲得のために試験を受けようと考えてない人も一度目を通して見るのはいいかもしれません。
楽しく基本情報の勉強が出来て、試験に合格出来ると考えると一石二鳥ですね。

因みに、自分は基本情報の資格は持っていません(笑)
今度、受験してみようかなとか思ってます。


![51ekcrVqOSL._SX350_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605875/b44d5777-4e6b-8431-52ef-41c32c79633a.jpeg)

>参考 [キタミ式イラストIT塾 基本情報技術者](https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C03%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297117819/ref=sr_1_1_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=P6UAG14UAH3J&dchild=1&keywords=%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1&qid=1624673235&sprefix=%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%2Caps%2C281&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExQVBKNjZPUUlCUE9GJmVuY3J5cHRlZElkPUEwMjA3NjUwMk9NVUw0NktUVFFPOCZlbmNyeXB0ZWRBZElkPUExN1BZRUlFRlgyVzhPJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==)

# プログラムはなぜ動くのか
次に読んだ本としては、プログラムはなぜ動くのかという本です。この本はビットから始まり最後にはC言語のプログラムが実行される過程を紹介してくれます。基本情報で勉強したビット, CPU, メモリ, HDD, OSなどの知識を復習することが出来、それらの知識の補完になりました。ビットからC言語のプログラムまでが実行される一連の動きを見ることが出来るのオススメです。

ここら辺からOSについて興味を持つようになりました。

自分は読んだのは、第2版になるのですが、最近になって第3版が14年ぶりにに出たみたいです。

![51Pb75AvxjS._SX333_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605875/c2b30400-58ed-e4ad-6ad4-d3207dc5f4d6.jpeg)

> 参考 [プログラムはなぜ動くのか](https://www.amazon.co.jp/dp/4296000195?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=9784296000197&qid=1619146471&sr=8-1&linkCode=sl1&tag=garr_reynolds_3_20161222-22&linkId=5afd9d10626b1d93fb00855b9168ccfe&language=ja_JP&ref_=as_li_ss_tl)

# コンピュータシステムの理論と実装

この本は、本当に低レイヤーの内容を広くキャッチアップ出来るようになってます。
自分で一から作ろうと理念のもと様々なものを一から自分で作成します。自分的にはかなり重たかったんですが一つ一つの章をクリアしていく時の達成感と面白さは格別です。分からなくなった時には、GitHubにコードを上げている人がいたのでその人を参考にして作っていくことも出来ます。
低レイヤーといっても沢山の分野があるのでこの本を通してどの分野をさらに掘っていきたいのかを見つけることが出来ると思います。

![picture_large978-4-87311-712-6.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605875/9a89f130-36fb-70f4-8d76-2d9625ce7b63.jpeg)


> 参考 [コンピュータシステムの理論と実装](https://www.oreilly.co.jp/books/9784873117126/)

# その他
一旦ここで、shellについて興味が湧いたの自作shellを作って見ることにしました。システムコール, パイプ, リダイレクト, ファイルシステム, ファイルディスクリプタ, プロセス, スレッドなど他にもここで様々なことを学ぶことが出来ました。
下記がその時に作成したshellです。

https://github.com/fumiya5863/ImmatureShell

# 本・ネットワークにあるOSに関する論文と資料
この段階になってOSに興味が完全に移ったので、OSを重点的にやることにしました。
やった内容としては、本・ネットにある論文や資料を読んだことです。特に大学が提供している資料が凄く役にたったと思います。OSの基礎的な知識の補完にもってこいでした。今の時代、論文や資料が無料でネットで読むことが出来ると思うと凄く有難いと思いました。

OS \[大学名\] で検索をすると沢山の資料が出てきます。

読んだんでよかった本は、下記の二つです。OSの仕組みを学びながら実際に手を動かして学ぶことが出来ます。

![51r+eNsY2fL._SX258_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605875/d7f53598-4897-2402-bccf-f7de34e86aa0.jpeg)

>参考 [[試して理解]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)

![41HbBZyeJ3L.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605875/0c46bf9e-92a5-d0c4-4f41-14f744516492.jpeg)


> 参考 [ふつうのLinuxプログラミング 第2版　Linuxの仕組みから学べるgccプログラミングの王道](https://www.amazon.co.jp/%E3%81%B5%E3%81%A4%E3%81%86%E3%81%AELinux%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E7%AC%AC2%E7%89%88-Linux%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B9%E3%82%8Bgcc%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E7%8E%8B%E9%81%93-%E9%9D%92%E6%9C%A8-%E5%B3%B0%E9%83%8E-ebook/dp/B075ST51Y5/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2PXUS02O6BEQ2&dchild=1&keywords=%E3%81%B5%E3%81%A4%E3%81%86%E3%81%AElinux%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&qid=1624683415&s=books&sprefix=%E3%81%B5%E3%81%A4%E3%81%86%E3%81%AELinux%2Cstripbooks%2C270&sr=1-1)


# カーネルモジュール
ここで、自分でOSに機能をどのように追加出来るだろうと考えたのですが、一からOSを実装するのは、まだまだ知識が足りてないとなり、カーネルモジュールを作って簡単で小さな機能を追加しようと思いました。

下記が自分が作成したカーネルモジュールのチュートリアルになります。

https://github.com/fumiya5863/Kernel-Footprints

# キャラクタデバイス開発
簡単なカーネルモジュールを作っていたので何か面白い機能を作れないのかと調べた時に、[satさん](https://zenn.dev/satoru_takeuchi)の記事で、[たのしく学ぶLinuxカーネル開発(第二回): システムを一時的に停止させる](https://zenn.dev/satoru_takeuchi/articles/f068e979dad99cc5230b)を読ませて頂き、システムを一時的に停止させるstop-machineがあることを知りこれを利用して自由に時間を決めて停止することが出来る、キャラクタデバイス開発する事にしました。

https://github.com/fumiya5863/Kernel-Stop-Machine

# さいごに
今回は、自分がどのような過程で低レイヤーの沼に入ったかを紹介させて頂きました。低レイヤーを学ぶ過程で様々な仕組みについて学ぶことが出来ました。何故ここが動くのか、ここはそういった仕組みなっているのかと一つ一つ理解してそれを実践していくのは興奮するくらい面白いです。
また、常にいろいろな低レイヤーのお話に対してアンテナを立てておくことも重要です。自分はTwitter, はてブ, RSSなどで低レイヤーの情報を発信している方の内容を見たりしています。
次にやりたいこととしては、自作OSの本をやりながら、カーネルについて深く知っていこうと思います。

低レイヤー最高です！