ゆたかさんの「私はどのようにして Linux カーネルを学んだか」を読んだ
自分自身は Linux カーネルを読むまではする予定がないが、
基本知識+実際にコードを読むにあたってのノウハウが完結にまとまっていて素晴らしい。
全体的に図が分かりやすい。
雑多メモ#
個人的には第6章の Linux カーネルの役割がためになった。
CPU やプロセスの動き周りは知っておきたいところ。
メモリを共有するのかしないのか#
- ユーザプロセスは、メモリ空間がそれぞれ割り当てられる。
- 1 プロセス内のスレッドはメモリを共有する。
- カーネルは1つのメモリ空間を共有する
CPU が持つレジスタにどんな情報が格納されているか。#
プログラムカウンタ#
- CPU が次に実行する命令を指し示す
- 次にやることが書いてあるメモリの場所を記憶するレジスタ
スタックポインタ#
- スタック領域の先頭部分を指し示す
- 次に使えるメモリにあるスタックの番地を記憶するレジスタ
フラグレジスタ(ステータスレジスタ)#
- CPU の演算結果が反映、条件分岐の実行に使われる
- 計算処理中に桁あふれを起こしたとか計算結果が0になったとか処理の状態を記憶するスレジスタ
汎用レジスタ#
- ヒープ領域
- ソフトウェアで自由に読み書きができる
スタック領域#
- 実態は物理メモリ
- ローカル変数の格納先でもある
参考 http://ponsuke-tarou.hatenablog.com/entry/2017/10/03/235932
プロセスの切り替え#
context_switch()でプロセスのページテーブル(ユーザプロセスの仮想メモリ空間)を切り替え
__switch_to_asm()…CPU が管理する対象のスタック領域を変更
ページング#
ページングによる仮想メモリの実現とメリットをあまり意識してなかった。
ユーザプロセスは仮想アドレスを指していて、直接物理アドレスで参照してるわけではない。