お待たせしました

本日から更新を再開いたします。(毎日ではありませんが)
なお今回はCがタグから外れます。
多分近いうちに復活しますが.......

急遽予定変更しまして、xv6回を別シリーズとします。詳しくはC言語を一切シリーズの18回で説明します。

まずは準備!!!

今回はUbuntu 14.04 LTSを使っていきます。
適当にVirtualBoxとかで実行してください。
最初に開発のためのツールをインストールしなければいけないので端末を開き
$ sudo apt-get install build-essential
を実行してください。次に起動させるためのQEMUをインストールしましょう
$ sudo apt-get install qemu
これは必須ではありませんが
$ sudo apt-get install git
でgitをインストールすればgit経由でcloneできます。
$ git clone https://github.com/mit-pdos/xv6-public.git
早速ソースコードをcloneしましょう。そしてxv6-publicに移動しましょう。
lsで調べてみるとこんな感じになるはずです。
スクリーンショット 2018-05-03 13.48.10.png
せっかくなので起動させてみましょう。
$ make qemu
スクリーンショット 2018-05-03 13.53.47.png
起動した!!!
最後に教科書と言える
https://pdos.csail.mit.edu/6.828/2017/xv6/book-rev10.pdf
をダウンロードしましょう。英語がわからない方は
https://peta.okechan.net/blog/archives/1215
から進めていきましょう!内容は大して変わらないと思います。
(偉そうなこと言ってますが、私も大して英語はできません笑)
ということで早速学習スタートです!

Chapter 0 Operating system interfaces

OSの仕事は複数のプログラムを一つのコンピューター上で動かしてハードウェア単体の機能よりも有用な機能を提供するものだそうです。そしてOSはハードウェアの抽象化、管理を行っているそうです。ハードウェアをシェアっていうのは恐らくメモリとかの話ですね。あれもOSの機能でしたし。あとはxv6を理解すると他のOSの理解が深まるよーとか。ユーザー空間とカーネル空間に分かれてるとか。ユーザー空間からカーネルにシステムコールを送るとか。
qiitafigure0-1.png
(ページ8の資料の日本語版、この資料はイメージしやすいと思いますが.......絵が下手だなぁ)
シェルの概要とか話して。

hoge.c?
int pid = fork();
if(pid > 0){
printf("parent: child=%d\n", pid);
pid = wait();
printf("child %d is done\n", pid);
} else if(pid == 0){
printf("child: exiting\n");
exit();
} else {
printf("fork error\n");
}

Cっぽいんですけどこれ何の言語ですかね......pidにforkを代入している?
(pid: process identifier, fork: プロセスのコピーを生成するもの)
なるほどなるほど......forkでchild processを作るのか。
child processはコピーだからparent processと同じと。
parentのforkから帰ってくる値はchildのpidでchildから帰ってくる値は0?
if文でpidが0かどうかチェックしているのか。
0じゃなかったらおかしいと。
わかった様なわかってない様な.......

Figure 0-2

さっきの様に画像にしようかと思いましたが、文章オンリーだしそのまま書きます。

fork() プロセスの生成
exit() 現在のプロセスを終了
wait() Child processが終了するのを待つ
kill(pid) pidのプロセスを終了
getpid() 現在のプロセスのpidを返す
sleep(n) nクロック単位だけスリープする
exec(filename, *argv) ファイルを読み込んで実行する
sbrk(n) プロセスのメモリをnバイト増やす
open(filename, flags) ファイルを開く、flagsで読み書きを制御
read(fd, buf, n) 開いてるファイルからnバイト読み込んでbufに入れる
write(fd, buf, n) 開いてるファイルにbufの内容をnバイト書き込み
close(fd) 開いてたファイルを閉じる
dup(fd) fdを複製する
pipe(p) パイプを生成してpのfdを返す
chdir(dirname) 現在のディレクトリを変更する
mkdir(dirname) 新しいディレクトリを作成する
mknod(name, major, minor) デバイスファイルを作成
fstat(fd) 開いてるファイルの情報を返す
link(f1, f2) ファイルf1の別名f2を作成
unlink(filename) ファイルを削除する

Chapter 0の続き

Figure 0-2から見るにさっきのコードはシステムコールを使ったものだったんでしょうね。
そこからまたコードが出てきたりしてI/OとかPipeとかファイルシステムの話とかやりました。
runcmdとか凄く参考になるアイデアで何というか.......すごいの一言でした。
自分は極度の「恐ろしくすごすぎる」は嫌いです。
何故かというと「すごい」の方が読む側にとって参考になるからです。
というわけでこんな感じのシステムコールとかやってChapter 0は終わりです。

短い

「ほとんどシステムコールの説明と謎で下手な画像じゃないか!」
仕方ないんです、流石に頭の中で翻訳した内容を全部ここに書くのは無理です。
手が折れます.......最初に書いた様に日本語がいいという人は
https://peta.okechan.net/blog/archives/1215
見た方が全然いいです。古い内容ではありますが、理解できない場所を残すよりは幾分いいので。
Chapter 1やろうかな、とも考えたのですがモチベーション維持のために今回はここまで。
19ではChapter 1をやっていくんですけど生憎手を付けていません。
そのため、次回がいつになるか確約はできませんが多分近いうちに投稿します。
次回:近いうちに

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.