LinuxでCPUの性能の調査をしているとき、ふとSMP (Symmetric Multiprocessing) の実装が気になった。複数のプロセッサ、コア間でどのようにマルチプロセス、スレッドを実現しているのかを知りたくなった。ところが、同期方法に関する資料はあってSMPの実装に関する資料は見つけるのが難しい。
シングルプロセッサであれば話は単純で、一定間隔で発生するタイマー割り込みのタイミングで切り替える。割り込みが発生したところで現在のコンテキスト(レジスタの内容)を保存し、割り込みから復帰するときに別のプロセス、スレッドのコンテキストに戻して復帰する。その結果、別のプロセスやスレッドに実行の状態を切り替えることができる。
SMPの実装を調査しようと、いきなりLinuxのソースコード https://kernel.org/ にアクセスすることはお勧めしない。Linuxのソースは様々な環境に対応するため広大、複雑であり、慣れていないとたちまちにソースの迷宮に閉じ込められる。
よりコンパクトで現代的なOSの実装としてxv6というものがある。これはMITの講義で使用される教育用のOSであり、SMPに対応したマルチプロセス、スレッドに対応している。
xv6のページ:https://pdos.csail.mit.edu/6.828/2018/xv6.html
MITのOperating Systemという講義資料にOSのソースがある。referenceにはintel system developers manualなど貴重な資料が大量にある。SMPの実装を調べるに役に立つだろう。
とりあえず使ってみよう
ソースコードはgithubから取得することができる。
$ git clone https://github.com/mit-pdos/xv6-public.git
ubuntu20.04の場合、build-essentialをインストールして開発環境をインストールする。そして、実行環境はqemu-system-i386を入れる。
$ sudo apt install build-essential
$ sudo apt install qemu-system-i386
xv6をビルドして実行するには、リポジトリのディレクトリに入ってqemu-noxのターゲットをmakeする。すると、必要なOSイメージがビルドされ、qemuが立ち上がり、OSが実行される。
$ cd xv6-public
$ make qemu-nox
SeaBIOS (version 1.13.0-1ubuntu1.1)
iPXE (http://ipxe.org) 00:03.0 CA00 PCI2.10 PnP PMM+1FF8CA10+1FECCA10 CA00
Booting from Hard Disk..xv6...
cpu1: starting 1
cpu0: starting 0
sb: size 1000 nblocks 941 ninodes 200 nlog 30 logstart 2 inodestart 32 bmap start 58
init: starting sh
$
lsコマンドを実行すると実行可能なコマンド一覧が出力される。
$ ls
. 1 1 512
.. 1 1 512
README 2 2 2286
cat 2 3 16248
echo 2 4 15104
forktest 2 5 9408
grep 2 6 18468
init 2 7 15688
kill 2 8 15132
ln 2 9 14984
ls 2 10 17616
mkdir 2 11 15232
rm 2 12 15208
sh 2 13 27852
stressfs 2 14 16120
usertests 2 15 67228
wc 2 16 16984
zombie 2 17 14800
console 3 18 0
qemuから抜け出すには Ctrl-A – x を入力する(Ctrl-Aを入力したのち、xを入力する)。Ctrl-Aはqemuのホットキーである。
コメント