エンジョイC025回目仮想記憶3(2020-09-13)

1
ほえほえ@スプシマン @hoehoe1234

エンジョイC 25回目 2020/09/13(日) 延々と仮想記憶について講義しています。これは仮想記憶(V)が物理メモリ(P)にマップされる一例。PAR0~7がすべて0の場合は仮想記憶の全ページが物理アドレスの同じページにマッピングされます。 pic.twitter.com/Diel9Hwztl

2020-09-21 11:16:22
拡大
ほえほえ@スプシマン @hoehoe1234

PARの内容を、仮想アドレスの上位3ビットがが000~111に対して111~000に設定した場合、仮想アドレスの8ページが物理アドレスで逆にマッピングされる事例の説明です。 pic.twitter.com/kBkOHuh9CP

2020-09-21 11:18:01
拡大
ほえほえ@スプシマン @hoehoe1234

単につくるだけでなく、「どうすればその挙動がただしいと検証できるか」を説明しています。これは物理メモリ256に対して仮想メモリ64KをPARの上位2ビットでマップを変えた場合にどうなるか?の説明です。 pic.twitter.com/a7Fa88NO5r

2020-09-21 11:19:17
拡大
ほえほえ@スプシマン @hoehoe1234

確認用の演習問題の説明です。演習問題を実装する上での観点を説明しています。特に③のPARの選択ほうほうなどはちょうど勉強した牛本のマクロがうまくつかえそうですね。 pic.twitter.com/SoszF9iVYa

2020-09-21 11:21:04
拡大
ほえほえ@スプシマン @hoehoe1234

今度は逆に、「どうして特定のプロセスのPPDAがカーネルの6ページ目のu構造体にマッピングできるか?」の話しです。仮想アドレスから物理アドレスを算出する逆の考えで任意の物理アドレスを特定の仮想アドレスに割り当てます。これがこの章で必要な最終的な理解です。 pic.twitter.com/24bW3x3ggS

2020-09-21 11:23:44
拡大
ほえほえ@スプシマン @hoehoe1234

proc構造体のp_addr変数、すなわち物理アドレスを1/64した値をPAR6に設定するとカーネルの仮想アドレスC000から見えますよ。という話しです。C000からPAR6が選ばれ、そこに設定されている下駄がp_addrということですね。 pic.twitter.com/1AeLeuk2ex

2020-09-21 11:25:42
拡大
ほえほえ@スプシマン @hoehoe1234

これは書き方の解説です。難しい概念は「数学」として捉え直すのもよい方法です。巧妙なコードは数字としての演算と内部実装としての演算があえて、意図的に、混在されています。ここでは十進数を使ってページと要素数に分解する手法を説明しました。 pic.twitter.com/n3pKjfl8Rs

2020-09-21 11:28:31
拡大
ほえほえ@スプシマン @hoehoe1234

0~999のシーケンシャルな数字は、概念的に切る位置で1ページ1000要素、10ページ100要素、100ページ10要素、1000ページ1要素。どのようにも捉えることができます。これがまさに仮想アドレスから物理アドレスへの変換で使用しているしくみです(上位3ビットで8ページに分ける

2020-09-21 11:30:27
ほえほえ@スプシマン @hoehoe1234

演習問題について少し具体的な解説をしました。たとえば②については仮想アドレスを右13ビットシフトすることで直接PAR配列のインデクスを得ることができます。これもちょうど牛本で学んだことなので都合がよかったです。 pic.twitter.com/lMhpu5qTNW

2020-09-21 11:32:14
拡大
ほえほえ@スプシマン @hoehoe1234

生徒さんのコードですが、13ビットシフトするとPAR配列のインデックスが仮想アドレスの値に応じて直接得られる。ということを検証していただきました。 pic.twitter.com/gMtZjOZ5at

2020-09-21 11:33:19
拡大
ほえほえ@スプシマン @hoehoe1234

今回はここまでです。仮想記憶の仕組みはOSのコードを理解する上での中心的な概念の一つなので演習問題も交えてしっかりと理解していただけるようにカリキュラムを考えてみました。難しいものを理解するにはやはりそれ相応の時間がかかります。楽な道はないということですね。

2020-09-21 11:35:10