読みながら、良く知らなかった項目をメモ。知らないことばっかりだ...
2. Linuxカーネル
2.1 Linuxアーキテクチャ
大きく、ハードウェア・カーネル・ユーザ空間に分類される。本書ではカーネル・ユーザ空間に焦点を当てる。カーネルとユーザ空間の間は、システムコールによって定義されている。
2.2 CPUアーキテクチャ
BIOSとUEFIは、Linuxの起動時に使用するもの。モダンな環境では、BIOSはUEFIに置き換わっている。
2.3 カーネルコンポーネント
プロセス管理:実行ファイルに基づくプロセスの起動
- セッション:複数のプロセスグループを含む
- プロセスグループ:複数のプロセスを含む
- プロセス:プログラムの実行に必要なリソースをグループ化したもの
- スレッド:カーネル内ではプロセスとして実装されている。カーネルから見ると、プロセスは他のプロセスと特定のリソース(メモリやシグナルハンドラなど)を共有するプロセスとなる。
- タスク:
task_struct
(sched.h)というデータ構造により実現されている。
$ ps -j プロセスID プロセスグループID セッションID PID PGID SID TTY TIME CMD 2656418 2656418 2656418 pts/18 00:00:00 bash 2692868 2692868 2656418 pts/18 00:00:01 emacs 2693310 2693310 2656418 pts/18 00:00:01 emacs 2695194 2695194 2656418 pts/18 00:00:04 emacs 2701144 2701144 2656418 pts/18 00:00:01 emacs 2702971 2702971 2656418 pts/18 00:00:03 emacs 2847412 2847412 2656418 pts/18 00:00:00 ps
メモリ管理:プロセスのメモリ割り当て、ファイルをメモリにマップすることなど
- Hugepage:4KB以上のページテーブルをサポートする
$ grep MemTotal /proc/meminfo MemTotal: 32595172 kB $ grep VmallocTotal /proc/meminfo VmallocTotal: 34359738367 kB $ grep Huge /proc/meminfo AnonHugePages: 0 kB ShmemHugePages: 0 kB FileHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB
ネットワーク:ネットワークインタフェースの管理、ネットワークスタックの提供など
- ソケット・TCP/UDP・インターネットプロトコル(IP)
- ファイルシステム:ファイル管理、ファイルの作成と削除など
- デバイスドライバ:デバイスの管理
- ハードウェアであったり、
/dev/pts/
以下に存在する疑似端末のようなデバイスを扱う
- ハードウェアであったり、
- システムコール
- glibc / muslなどの標準ライブラリによって提供されている
$ strace ls execve("/usr/bin/ls", ["ls"], 0x7ffee3497670 /* 33 vars */) = 0 brk(NULL) = 0x559d35cee000 arch_prctl(0x3001 /* ARCH_??? */, 0x7ffe3e02a440) = -1 EINVAL (Invalid argument) mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6b94462000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/storage/eda/tools/img/cs_v131/Toolchains/mips-img-linux-elf/2015.06-05/lib/glibc-hwcaps/x86-64-v3/libselinux.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) newfstatat(AT_FDCWD, "/storage/eda/tools/img/cs_v131/Toolchains/mips-img-linux-elf/2015.06-05/lib/glibc-hwcaps/x86-64-v3", 0x7ffe3e029660, 0) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/storage/eda/tools/img/cs_v131/Toolchains/mips-img-linux-elf/2015.06-05/lib/glibc-hwcaps/x86-64-v2/libselinux.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) newfstatat(AT_FDCWD, "/storage/eda/tools/img/cs_v131/Toolchains/mips-img-linux-elf/2015.06-05/lib/glibc-hwcaps/x86-64-v2", 0x7ffe3e029660, 0) = -1 ENOENT (No such file or directory) ...
2.4 カーネルの拡張
- モジュール:必要に応じてカーネルにロードできるプログラム
- eBPF(extended BPF):bpfシステムコールを使って、Linuxカーネルの機能を安全かつ効率的に拡張する。eBPFはカスタム64ビットRISC命令セットを使ったカーネル内の仮想マシンとして実装されている。