まだまだ知識不足ですね。
第2回目が始まる前に30分ほど復習の時間をとっていただけましたので、メモを書いておきます。
第1回のまとめは以下参照
http://xiangcai.at.webry.info/201011/article_7.html
●SWAP、Paging
SWAP、Pagingについては問題なし
仮想記憶を実現するには、ハードウエアサポート(MMU)が必要になる。
(余談)
SUN1は68000を使っていたが、68000はMMUを搭載していない。
どうやって仮想記憶を実現したかというと68000を2つ搭載していて
1つめのCPUがこけたら2つめのCPUで復旧するという方法で実現していた。
SUN1について
http://ja.wikipedia.org/wiki/Sun-1
68000の仮想記憶については以下の「MC68000 での仮想記憶のサポート」参照
http://ja.wikipedia.org/wiki/MC68000
仮想記憶について
http://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E8%A8%98%E6%86%B6
●仮想記憶に関する補足
仮想記憶は参照の局所性(プログラムが限られた時間内では特定のページのみアクセスする)を利用して必要なページのみメインメモリ内に保持することで、実メモリ以上のプログラムを見かけ上同時に実行しているかのようにみせることが出来る。
使わないページのHDDへの退避について
LRUアルゴリズムに従ってページをHDDへ退避します。
FreeBSDでは、2 Way Clock arugorizumu?を使っている
→2 Way Clock arugorizumuで検索しましたがヒットしませんでした。
下記のページの「ページ置換え」のところに「クロックアルゴリズム」という記述がありますが、これだろうか?
http://www.multisoft-lab.com/os/memory.html
●Pageについて
最初から4KBに分かれていて、問答無用でぶった切り
●スタックとヒープ
C言語の実行可能ファイルにおけるフォーマットを理解する必要がある。
→リンカ・ローダ実践開発テクニック(坂井 弘亮著)が参考になります。
ネットだとこの辺とか
http://www.coins.tsukuba.ac.jp/~yas/coins/syspro-2000/2000-04-17/process-memory.html
http://www.ertl.jp/~takayuki/readings/info/no02.html
以下のセクションに分かれている
header
text
data
bss
heap
stack
以下の図参照(こんなイメージ?)
新たな疑問
forkはプロセスID以外まったく同じコピーを作るとのことでしたが、これらのセグメントも全てコピーしている?
heapは下に伸びる、stackは上に積むと、どっかでぶつかったりしないのだろうか?
1つのプロセスで確保できるメモリは2の16乗(65536)つまり64KB(1024×64)?
●forkについて
大体OK
forkが二度リターンする(とっても重要)
以下のコードで実装しているのですが
503 if (save(u.u_ssav)) {
504 sureg();
505 return(1);
506 }
ここのsaveが数少ないアセンブラのコード
http://www.tamacom.com/tour/kernel/unix/S/1.html
.globl _save
714 _save:
715 mov (sp)+,r1
716 mov (sp),r0
717 mov r2,(r0)+
718 mov r3,(r0)+
719 mov r4,(r0)+
720 mov r5,(r0)+
721 mov sp,(r0)+
722 mov r1,(r0)+
723 clr r0
724 jmp (r1)
スタックにレジスタの値を退避して、r1へジャンプしているのは分かるのですがどうやらこの辺は核心部分らしく、まだピンと来ません。
何度も出てくるそうなので、今のところは、ここまでとしておきます。
カーネルにおけるタスクのスイッチングについても、今後の課題
0 件のコメント:
コメントを投稿