プログラミングナイト016回目OSコードリーディング補講(2021-06-16)

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

プログラミングナイト、OSコードリーディング編雑記(2021-06-16) 本日のプログラミングナイトは、仮想記憶の仮想アドレスから物理アドレルへの変換の仕組みを簡単にC言語のプログラムとして実装してみました。 pic.twitter.com/x47y4YeCG9

2021-06-16 00:45:35
拡大
ほえほえ@スプシマン @hoehoe1234

変換ルールは次のとおりです。 ①仮想アドレスの上位3ビットはPARのセレクタとして使用する(範囲は0~7までの8値) ②(仮想アドレスのブロック+選択されたPARの値)*64 + オフセット というものです。

2021-06-16 00:47:20
ほえほえ@スプシマン @hoehoe1234

仕組みに忠実に変数を定義して計算式を構築します。このような場合は変換対象を忠実に説明変数化するとわかりやすいとおもいます。 pic.twitter.com/7kQNTKZiPo

2021-06-16 00:49:03
拡大
ほえほえ@スプシマン @hoehoe1234

このあたりはC言語ぽいですね。ビット演算、マスク、(みえてはいませんが)配列とポインタの混在記法を使用しています。 pic.twitter.com/KwvDoRODjZ

2021-06-16 00:50:00
拡大
ほえほえ@スプシマン @hoehoe1234

このaはすべて同じ値となります。C言語は少々トリッキーな書き方ができますが、基本のルールはごく少ないのでルールを覚えれば迷うことなく読めるようになります(後置演算子から評価されます)。 pic.twitter.com/l4J59ajuzf

2021-06-16 00:52:01
拡大
ほえほえ@スプシマン @hoehoe1234

配列は、配列定数ですので代入はできません。C言語の 抽象解析木をみることはできませんが、アセンブラ出力はみることができるので、なんとなく想像が付きますね。変数はそれぞれラベル(アドレス)になっていますね(たぶんw) pic.twitter.com/fW0gYrKYhb

2021-06-16 00:54:27
拡大
ほえほえ@スプシマン @hoehoe1234

なのでPAR_proto1に代入はできません。当然ですがその要素には代入できます。PARはint *と宣言していますので4バイト確保されているようです(読み方未調査部分おおし)。PARに代入するとこの領域に書き込まれます。

2021-06-16 00:56:32
ほえほえ@スプシマン @hoehoe1234

生徒さんが作成したコードです。OSコードリーディングのC言語から初めて随分上達されたように思います。すばらしい成長だとおもいます。あとはポインタとC言語の不思議記法のルールを覚えれば結構コードが読めるようになると思います。 pic.twitter.com/1ne1KmyGNw

2021-06-16 00:58:32
拡大
ほえほえ@スプシマン @hoehoe1234

このあたりはまだ配列に慣れてないのでこのようになっていますが、逆にいえばこの段階でコードをかきあげてくるのはすごいですね。 pic.twitter.com/0s3r47wIkj

2021-06-16 00:59:32
拡大
ほえほえ@スプシマン @hoehoe1234

新しいC言語?は2進数定数がかけます。べんりですね。 pic.twitter.com/1wKtcLvveK

2021-06-16 01:00:55
拡大
ほえほえ@スプシマン @hoehoe1234

int []とint *をこのように混在させて使うことができます。ポインタの配列記法は特に便利、かつ、コードがわかりやすくなりますね。 pic.twitter.com/Q8LSmPY5iJ

2021-06-16 01:02:54
拡大
拡大
ほえほえ@スプシマン @hoehoe1234

OSコードリーディングの補講としてMMUの仕組みを解説してきましたが、演習にたどり着くことができました。仮想記憶の仕組みはv6のカーネルコードを読む上で必須の知識ですので解説できてよかったです。おしまい。

2021-06-16 01:04:58