matobaの学んだこと

とあるPythonエンジニアのブログ。ソフトウェア開発、執筆活動、ライフログ。

Linuxのしくみを学んでいる話

Linuxのしくみ、と言う本を買って読んでるので、今日の学びのメモを公開します。

どの本の話?

この本です。

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

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

Amazonで買いました。

Linuxの仕組みについて書いている本で、Linux OSがどうやって動いているの?と言うのを説明しています。

買うきっかけ

きっかけは、 id:tell-k のPyCon JP 2018の発表を見たことです。

www.youtube.com

tell-k.github.io

この発表の中で、Linuxのしくみと言う本がイイヨって紹介されてたので、買いました。

そもそも、もっとLinuxのことを知りたかったと言うのもあります。 発表で話していた内容は興味のある内容だったと言うのと、興味のある内容を深掘りした情報がこの本の中にあるんだろうと思ったので買いました。

なお、アフィリンクは見つかりませんでした。残念。

どう?

まだ、全部読んでないのですが、わかりやすそうです。

と言うか、結構、しくみの前提の話から説明してくれるようなところがあって、初心者向けだと思いました。僕は初心者なのでありがたいです。(と言ってもまだ、1章と2章しか読んでませんが)

Linuxの本でいうと、以下の本も興味があって目を通したことがあるのですが、こちらの本はLinuxの歴史的な経緯の話が多くて、今回読んでいる本とはテイストが少し違います。

改訂3版 Linuxエンジニア養成読本 (Software Design plus)

改訂3版 Linuxエンジニア養成読本 (Software Design plus)

例えば、なぜ、ディストリビューションがいくつもあるのかとか、フォーマットがいくつもある理由とか、そういう話を書いています。合わせて読むと面白そうです。

今日の読書メモ

今日読んだところで、私が新しく学んだことを抜粋して書きます。

CPUには動作モードがある

CPUには、動作モードがあるようです。そして、動作モードによって、できることが違います。 その二つは、特権モードとユーザーモードです。

特権モードは、カーネルモードとか呼ばれることがあるみたいです。 本の中では、カーネルモードと書いていました。 この話を僕は理解できてなかったので、インターネットを調べました。

コンピュータが各種デバイスを操作する命令は、CPUが出しますが、CPUが特権モードでないとデバイスの操作命令を出さないようになっているのだと思います。

カーネルだけが特権モードを使える

Linux では、カーネルだけが特権モードを使えるように設計されているようです。

ちょっと本の外に出てインターネットを検索して調べていたところ、いろんなプロセスが特権モードを使ってデバイスを制御できる状況にあった時代もあったようです。

でもそれだと、アクセス権限の管理が大変だったし、複数プロセスを動かすのが大変だったから、カーネルと言うのを挟んで、特権はカーネルだけが使えるようにしているという話のようです。(多分)

で、特権モードはカーネルしか使わないんだから、カーネルモードと読んでる状況かと思います(これも多分)

カーネルへの依頼はシステムコールという

カーネルしか特権モードを使えないようになっているので、デバイスを操作したいときはカーネルに依頼する必要があります。

カーネルへの依頼をシステムコールと言います。

本の面白いところ

今日読んだ中で、面白かったところ、印象に残ったところを紹介します。

実際のシステムコールサンプルがある

実際に、Cのコードを書いて、コンパイルして実行したときに、どんなシステムコールが呼ばれるのかのサンプルが本の中にあります。

僕も実際に実行してみました。なお、ubuntuで実行できるサンプルです。

実際に、システムコールを確認して見るのは面白いなあと思いました。

(大学時代に、こんな講義あったのかな。あったかもしれないけど、忘れてしまった)

スクリプト言語を使う人向けに書かれている

C言語の話やカーネルの話が出てくるのですが、本の説明はおそらくスクリプト言語を書いている人に向けられたものです。

スクリプト言語を使ってるんだけど、Linuxのしくみが知りたい人に必要最低限の知識を説明してくれているように思います。

大変ありがたい。

Pythonコードから出るシステムコールを確認できる

Pythonコードを動かした際に出力されるシステムコールも確認できます。

というか、そういうサンプルが本の中にありました。

自分が普段書いている言語のシステムコールがどうなっているのかを知れると、すごく強くなった感じがします。(雑)

あと、おそらく実際に確認することはないと思うのですが、どうやって動いているのかを知れるというのは、謎の安心感があります。

Pythonコードを変えて、システムコールを見る

Pythonを実行した時にシステムコールのトレース方法がわかったので、Pythonコードを変えて、システムコールがどう変化するのかを見て見ました。

以下、概要です。

  1. straceコマンドを使ってPythonを実行して、ログを取得する
  2. Pythonスクリプトをコピーして一部変更して、再度straceコマンドでログを取得する。
  3. 出て来たシステムコールの呼び出しログをdiffして、何が変わったのかを見る。

で、代入文とprintを追加しただけなので、それをざっと見て何が変わったか、というと以下のような処理が変わってました。

  • ファイルのパスをチェックする箇所
  • ファイルサイズを見て、確保するメモリを変える
  • ファイルをシークする際に終わり部分がどこか
  • ファイルを読み取る際の区切り位置

特に、なぜファイルを読み取る際の区切り位置が変わったのかはわからなかった。 1行ずつストレージから読み取ってるのかと思ったけど、そうではなくて、なんかまとめて読み込んでるっぽい。なぜかわからない。

もうちょっと色々試せたらいいけど、今日は疲れたので終わり。

終わり

ひとまず、今日のこの本の読書は、ここまでです。

また、そのうち続きを読んで、勉強したところとか、思ったことをかけたらいいなと思います。