Open3
「試して理解 Linuxのしくみ」を読んだときのメモ
はじめに
「30日でできる!OS自作入門」に取り組んで、OSの仕組みはなんとなく分かったものの、「作ったOSではこうしてるけど、普通のOSではどうしてるんだろう」という疑問がいくつもあったので、Linuxでどうしているかということについて学ぼうと思い立った。
第1章: Linuxの概要
プログラムとプロセス
カーネル
x86_64アーキテクチャにおいては4つのCPUモードがある。Linuxカーネルはカーネルモードとユーザーモードの2つしか使わない(p4)。
システムコール
p6. システムコール発行の可視化
# strace <コマンド>
strace -o hello.py.log ./hello.py
write(1, "hello world\n", 12) = 12
p7. システムコールを処理している時間の割合
# sar [-P <論理CPU番号>] <n秒ごとに> [<n回データを取る>]
sar -P 0 1 1
Linux ... 10/14/24 _x86_64_ (16 CPU)
10:40:07 CPU %user %nice %system %iowait %steal %idle
10:40:08 0 0.00 0.00 0.00 0.00 0.00 100.00
Average: 0 0.00 0.00 0.00 0.00 0.00 100.00
CPUを指定してプログラムを動かすコマンド
# taskset -c <論理CPU番号> <コマンド>
taskset -c 0 ./inf-loop.py &
p10. 監視、アラート、およびダッシュボード(コラム)
sarコマンドなどのシステム統計情報採取ツールはPrometheusなどでの監視に使われる。
p11. システムコールの所要時間
# strace -T <コマンド>
strace -T -o hello.py.log ./hello.py
write(1, "hello world\n", 12) = 12 <0.000055>
ライブラリ
p12. 標準Cライブラリ
リンクされた共有ライブラリを確認するコマンド
# ldd <実行ファイル>
ldd /bin/echo
Ubuntuにインストールされたライブラリを確認する
dpkg-query - W | grep ^lib
p14. システムコールのラッパー関数
x86_64におけるgetppid()システムコールのアセンブリ
mov <システムコール番号>, %eax
syscall
arm64におけるgetppid()システムコールのアセンブリ
mov x8, <システムコール番号>
svc #0
p15. 静的ライブラリと共有ライブラリ
違いはプログラムへの組み込み方(と拡張子)。静的ライブラリはリンク時に、共有ライブラリはプログラムの起動時にメモリにロードする。静的ライブラリはlib*.a(archive)、共有ライブラリはlib*.so(shared object)。また、lib*.so.x.yのようにバージョンをつけることもある。なお、動的ライブラリの多くは共有ライブラリであるが、特定のプログラムとしか連結しない動的ライブラリも存在し得るため、動的ライブラリは必ずしも共有ライブラリではないらしい。
共有ライブラリとの動的リンクを禁止する
# cc -static ...
cc -static -o pause pause.c
静的ライブラリの生成(補足)
# ar rcs <静的ライブラリファイル名> <オブジェクトファイル>
ar rcs libmine.a mine.o
なお、Windowsにおいてはlibという拡張子の場合もある。
動的ライブラリの生成(補足)
# gcc -shared -o <動的ライブラリファイル名> ...
gcc -shared -o libmine.so -c mine.c
なお、Windowsにおいてはdll(dynamic-link library)、macOSではdylib(動的リンク)、bundle(動的ロード)という拡張子の場合もある。
動的・静的ライブラリのリンク(補足)
同名の動的・静的ライブラリが共存する場合、動的ライブラリが優先される。
# gcc -L<フォルダ> -l<静的ライブラリ名> ...
gcc -L. -lmine
p18. 静的リンクの復権(コラム)
最近では共有ライブラリを使わず静的リンクが使われる傾向にある(Go等)。主な理由は以下。
- メモリやストレージの大容量化。
- 実行時にリンクしないので起動が高速。
- 実行ファイル一つあれば別の環境でも動作する。
- DLL地獄(DLL(dynamic-link library)の後方互換性の喪失によりプログラムが動作しなくなること。この問題は解決が難しい)を解決できる。
- x86_64アーキテクチャの他のCPUモードとは何か
- ダイナミックライブラリの検索のされ方について(
ldconfig等)