『Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識』第2章を読む
第二章ユーザモードで実現する機能
はじめに
武内 覚 著『Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識』をテキストとして学習した記録です。
本書を読んで筆者が解釈した内容について記述しています。
なので本書の内容の間違った解釈やあるいは単純に間違った記述がある可能性があります。
システムコール
基本的なプロセスの流れはそれぞれのコードからシステムコールを通してカーネルの処理を呼び出し、プロセスが意図する処理を実現するという流れになっている。
システムコールにはいくつかの種類がある
CPUのモードについて
CPUにはユーザモードとカーネルモードの二つのモードがある。 プロセスは普段ユーザモードで実行されているがプロセスの中でシステムコールが呼ばれるとCPUがカーネルモードへ変化する。そしてシステムコールの命令の内容が実行される。それが終わるとユーザモードの戻る、という流れになっている。
システムコール発行
プロセスがどのようなシステムコールを発行するかはstrace
というコマンドで確認することができる。
カーネルに処理を依頼する場合はどんな言語で書かれたプログラムであっても最後には必ずシステムコールを発行するようになっている。
strace
コマンドに-T
オプションを付与することでシステムコールに要した時間を計測することもできる。
システムコールのラッパー関数
システムコールはアーキテクチャ依存のアセンブリコードからのみ呼び出すことができる。
OSはこのシステムコール発行の際のアーキテクチャの違いも吸収してくれる。 具体的にはシステムコールラッパーと呼ばれるシステムコール呼び出し専用のプログラムを使ってこの問題を解決している。
これにより高級言語で書かれたユーザプログラムであってもアーキテクチャの違いを気にすることなく各種ラッパー関数を呼び出すだけでシステムコールを発行することができる。
標準Cライブラリ
ISOによって定められた標準Cライブラリというものがある。
ライブラリは処理系の一種でそれが提供される環境によって内容が異なる場合がある。 この違いを無くし、プログラムの互換性を高めるためにISOによって定められているレギュレーションがあり、それを満たすものとしてOSが提供するC言語のライブラリのことを標準Cライブラリと呼ぶ。
glibcはGNUプロジェクトが提供するCのライブラリであり、通常のLinuxではこれが標準Cライブラリとして提供されている。 glibcは前述のシステムコールのラッパー関数やPOSIXというUNIXの機能に関する規格に対応する関数を提供している。
その他OSが提供するプログラム
OSはライブラリ以外にも様々なプログラムを提供している。いずれもユーザプログラムやシステム自身を動作させるためなどに不可欠なものである。 例えばbashもその一つである。