SMPの実装を調査する

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のホットキーである。

コメント

タイトルとURLをコピーしました