序文
このコースを復習するときは、知識ポイントの復習に重点を置いてください。コンテンツ全体には合計 280 以上の知識ポイントがあり、そのすべてが最終試験に出題される可能性があります。過去の試験問題を復習するだけでは十分ではありません。前年度の試験問題は、一部の知識点のテストとしてのみ使用できますが、出題内容の目安となるだけでなく、復習する際には、学んだ知識点を可能な限り復習し、関連する部分を接続する必要があります。各章の
この回答は標準的な回答ではなく、今学期私が完成させたものです。1 年前に比べてすべての知識が分かっていないため、確認のためにいくつかの質問を数人の学生に解いてもらいましたが、コースはまだ終わっていないため、最後の質問は学生に解いてもらいませんでした。ご質問がございましたら、時間内に個別にご連絡ください。
復習状況確認の参考に:本書は全体的に簡単(最初の6問)で知識ポイントも少ないので、復習すれば問題なく解けるはずです。論文は完成までに 2 時間以上かかるのが普通で、最初の 6 問 + 最後の問題を読むまでで 2 時間あれば完了できるはずです (早く行けば一部でも可能です)。問題の量を気にする必要はありません。試験で難しい問題に遭遇した場合は、他の問題が正しいかどうかを確認するだけで十分です。最後の質問は少し難しくなります。参考のためにアドレス変換プロセス全体を書き留めておきました。アドレス変換プロセス全体を理解することは非常に重要です。最後の質問を理解していれば、アドレス変換のあらゆる形式の試験が合格します。問題ありません。
複数の生徒の成績によると、問題 4 も比較的間違えやすく、他の問題に比べて若干難しいですが、基本的な問題で間違えないように、最も基本的な組み立て手順で完了した動作を復習する必要があることに注意してください。
1.IEEE浮動小数点数
(1) 証明します:
IEEE 浮動小数点数は次のように表されます:
n = ( − 1 ) s × M × 2 E n=(-1)^s \times M \times 2^En=( − 1 )s×M×2E
コード部分は次のとおりです:
E = { e − バイアス正規化数 1 − バイアス非正規化数 E = \begin{cases} e- バイアス & 正規化数\\ 1-バイアス & 非正規化数\end{ ケース}E={
e−バイアス_1−バイアス_正規化された数値非正規化された数
質問の範囲内では、負の数や特別な値はありません。符号ビットは 0 であるため、最後の 31 ビットのみがエンコードに考慮されます。m<n の場合:
M m × 2 E m < M n × 2 E n M_m\times 2^{E_m}<M_n\times 2^{E_n}Mメートル×2Eメートル<Mん×2Eん
- 上式を満たすために Em=En、Mm<Mn を満たす必要がある場合、m と n の符号部は同じであり、仮数部は m<n、fm<fn となります。
- Em<En の場合、Mm と Mn は任意の値を取ることができます。
- m と n は両方とも正規化された数値です: E=e-bias、em<en、エンコーディングの上位ビット m<n、fm<fn
- m は正規化された数、n は非正規化された数です。これは存在しません、正規化された数 m < 非正規化された数 n
- m は非正規化された数、n は正規化された数: em (すべて 0)<en、エンコーディングの上位ビット m<n、fm<fn
|説明:
この問題は厳密な証明を必要とするものではなく、浮動小数点数の表現を列挙して個別に議論すれば十分であり、上記の 2 点があれば十分です。Em>En の場合、m<n は存在せず、その不都合は証明も説明も必要ありません。以下の図からわかるように、注文コードが大きい値は常に大きくなります。
(2) 証明します:
m+1 と n+1 も正規化された数値であると仮定すると、
stepm = m + 1 − m = 2 E m ( M m + 1 − M m ) = 2 E mstepn = n + 1 − n = 2 E n ( M n + 1 − M n ) = 2 E n step_m=m+1-m=2^{E_m}(M_m+1-M_m)=2^{E_m} \\ step_n=n+1- n= 2^{E_n}(M_n+1-M_n)=2^{E_n}ステップ_ _ _メートル=メートル+1−メートル=2Eメートル( Mメートル+1−Mメートル)=2Eメートルステップ_ _ _ん=n+1−n=2Eん( Mん+1−Mん)=2Eん
m<n より、Em<=En、つまり stepm<=stepn となります。
m が非正規化数、m+1 が正規化数、stepm=1 であると仮定します。(非正規化数コードは 1 バイアスであり、正規化数は E バイアスであるため、2 つの間のスムーズな移行が実現されます。上の表を参照してください。) このとき、n+1 と n の具体的な状況に関係なく、stepm<=stepn も存在します。
|説明:
この質問も厳密な証明は必要なく、状況に応じた簡単な説明だけです。
2. アセンブリコードの解析
(1)
23
(2)
6
(3)
(j>15) ? 0 : (j-15)
(4)
配列1[i][j] - 2配列2[k]
(5)
合計 + 配列1[0][0] + 配列2[0]
3. アセンブリコードの解析
(1)
*x>a+4y
(2)
xy>ua.i
(3)
test1(ua.pi, test1(ua.pi, ua.i+10))
|説明:
ua.piとua.iを直接uaとして記述するのも正しいですが、完全にソースプログラム内に記述する必要があります。この質問と前の質問は比較的簡単なので、間違いなく回答してください。
4. アセンブリプログラムのシミュレーション
(1)
フレーム スタックの変更プロセスは次のとおりです。
特に | ebp | |
---|---|---|
main関数に入り、スタックポインタを調整します | 0xbffff1e0 | 0xbffff1f8 |
P(5) を呼び出し、retaddr がスタックにプッシュされます | 0xbffff1dc | 0xbffff1f8 |
制御は P(5) に移され、スタック ポインタが調整されます。 | 0xbffff1c0 | 0xbffff1d8 |
P(16) を呼び出し、retaddr がスタックにプッシュされます | 0xbffff1bc | 0xbffff1d8 |
制御は P(8) に移され、スタック ポインタが調整されます。 | 0xbffff1a0 | 0xbffff1b8 |
P(8) を呼び出し、retaddr がスタックにプッシュされます | 0xbffff19c | 0xbffff1b8 |
制御は P(8) に移され、スタック ポインタが調整されます。 | 0xbffff180 | 0xbffff198 |
P(4) を呼び出すと、retaddr がスタック(質問で必要な位置)にプッシュされます。 | 0xbffff17c | 0xbffff198 |
制御は P(4) に移され、スタック ポインタが調整されます。 | 0xbffff160 | 0xbffff178 |
質問で要求された位置は実行されたばかりです。P(4) を呼び出します。(%esp) は戻りアドレス 0x804842f で、(%esp+4) はパラメータ 4 です。
|説明:
この質問は、プログラム実行中のスタックとスタック ポインタの変化を調べます。注意深くシミュレーションすることで完了できますが、時間がかかる場合があります。戻りアドレスをスタックにプッシュし、スタックを変更するCALL 命令を忘れないでください。ポインタ。
(2)
変更されたプログラム:
void p(int x){
cout<<x<<endl;
while(x>1){
if(x%2==0) x/=2;
else x=x*3+1;
}
}
再帰関数は自分自身を呼び出すたびにスタック領域を再度オープンしますが、再帰呼び出しの回数が多すぎるとスタック領域の枯渇によりセグメンテーション違反が発生します。非再帰的な状況に変更した後は、処理中に固定位置の x の値のみが変更されるため、スタック領域の枯渇の問題は発生しません。
5.CPU 設計に関する質問
(1)
追加されたパーツ:
(2)
レジスタBを追加します。
|説明:
この質問は、元のステータスとデータ パスに従って補足するだけでよく、すでに発生した同じ種類の命令による CPU 設計の問題が発生した場合は、すぐに解決できるはずです。
6. リンクと例外制御フロー
(1)
- 実行可能オブジェクト ファイルには .rel セクションがありません。.rel セクションには、リンク中に再配置するための再配置可能エントリが格納されます。リンクが完了すると、このセクションは実行可能ターゲット ファイルでは不要になります。
- 再配置後、実行可能オブジェクト ファイル内のセクションには、すでに最終的なランタイム メモリ アドレスが設定されています。リンカが再配置を実行すると、再配置可能オブジェクト ファイル内の同じタイプのすべてのセクションが同じタイプの新しい集約セクションにマージされ、実行時メモリ アドレスが新しい集約セクションと各シンボルに割り当てられ、シンボルの再配置が完了します。セクション内の参照。
- 実行可能なターゲット ファイルには .init セクションがあり、このセクションのコードはプログラムのロード後に初期化のために呼び出されます。
(2)
このコードには、シンボルの解析時に複数の定義上の問題があります。変数 x に対して、関数 f の定義が複数あります。関数と初期化されたグローバル変数は強いシンボルであり、初期化されていないグローバル変数は弱いシンボルです。シンボルの複数の定義は、次の規則に従って処理されます。
- 複数の強いシンボルは許可されません
- 1 つの強いシンボルと複数の弱いシンボル。強いシンボルを選択します
- 弱いシンボルが複数ある場合は任意に選択
このコード内の x の 2 つの定義はどちらも弱いシンボルであり、1 つの定義がランダムに選択されます。また、f には強力なシンボリック定義があり、x に値を割り当てる f 関数を使用します。実行時、x は int 型で 4 バイトを占有し、f は double 型に従って x に 8 バイトを割り当てます。これにより、メモリ内の x と y の位置が上書きされます。
(3)
移転は 2 つのステップに分かれています。
- 再配置セクションとシンボル定義: リンカは、同じタイプのすべてのセクションを同じタイプの新しい集約セクションにマージし、ランタイム メモリ アドレスを新しい集約セクションに割り当て、それを各シンボルに割り当てます。グローバル変数には、一意の実行時メモリ アドレスがあります。
- 再配置セクションのシンボル参照: リンカは、コード セクションとデータ セクションの各シンボルへの参照を変更して、それらが正しい実行時アドレスを指すようにします。このステップは、再配置エントリを使用して完了する必要があります。
(4)
実行可能ファイル名を入力すると、シェルは execve 関数を通じてローダーを呼び出し、仮想アドレス空間を変更し、実行可能ターゲット ファイルのセグメント ヘッダー テーブルの指示に従ってファイルのコードとデータ セグメントをメモリにコピーします。次に、プログラム エントリ _start に移動し、いくつかの初期化ルーチンを呼び出し、atexit ルーチンを呼び出して、終了時に呼び出されるいくつかのプログラムを登録します。次に main 関数が呼び出され、操作が完了すると _exit 関数が呼び出されてプログラムが終了し、制御がオペレーティング システムに戻ります。
(5)
SIGCHLD シグナルが生成され、親プロセスに送信されます。シグナルの受信者はシェルであり、子プロセスが停止または終了したことを示します。信号の非キューイングとは、同じタイプの最大 1 つの信号が保留中であり、同じタイプの後続の信号は直接破棄されることを意味します。これは、処理対象の信号がビット ベクトルを使用して保持されており、カウントできないためです。
|説明:
この質問は基本的な概念に関するものです。(1) は 2 点だけ回答する必要があり、少なくとも最初の 2 点は答えられるはずです。その他の質問は内容が非常に少ないので、できるだけ完全に回答するようにしてください。可能。
7. 仮想メモリ + メモリ階層
アドレス変換を高速化するため、アドレスキャッシュにはTLBを使用し、TLBがヒットするとPDEを取得し、ページテーブルの物理アドレスを計算し、PTEを求めてアドレス変換を完了します。図からわかるように、TLB は 4 方向のグループ関連付けを使用するため、検索プロセスでは、最初にインデックスを通じてグループを見つけ、次にタグを照合して検索します。TLB は VPN ビットを使用してインデックス付けされています。この質問のページは 4K で、オフセット VPO は 12 ビットを占めています。したがって、最初の 20 ビットが TLB 検索に使用されます。最初にアドレスを分割する必要があります。これらの 20 ビットのうち、グループインデックスは最後の 2 桁、タグは最初の 18 桁です。
ミスがある場合は、物理ストレージで PDE を見つける必要があります。PDE のアドレスはページ ディレクトリのベース アドレス 0x45d000 で、オフセットは仮想アドレスの最初の 10 ビットです。PDE4 バイトの場合、配列のアドレス指定と同様に、A[i] のアドレスは A+4i であるため、オフセットは 2 ビット左にシフトする必要があります。ページテーブルについても同様です。セカンダリ ページ テーブルは4KB で、ベース アドレスの最後の 12 ビットは 0 であるため、PDE から取得したセカンダリ ページ テーブルのベース アドレスは 12 ビット左にシフトする必要があります。
この質問では、TLB は物理ページ番号を直接キャッシュしますが、書籍では TLB は PTE をキャッシュします。この違いに注意してください。
(1)0x9fd28c10
最初の 20 桁は次のとおりです: 0x9fd28 = 100111111101001010 (TLBT) 00 (TLBI)
- TLBI: 0
- TLBT:27f4a
TLB を確認すると、このアドレスのエントリはありますが、有効ビットが 0 であるため、ヒットしません。メモリ内で偏微分方程式を見つける必要があります。
PDEADDR = 0x45d000 + 0x9fc (仮想アドレスの最初の 10 ビット、2 ビット左にシフト) = 0x45d9fc
メモリからの PDE の読み取りは次のとおりです。
0x0df2a237 = 0000 1101 1111 0010 1010 (最初の 20 ビット、レベル 2 ページ テーブルのベース アドレス、16 進数は 0xdf2a) 0010 0011 0111 (有効ビットは 1)
PTEADDR = 0x0df2a000 (レベル 2 ページ テーブルのベース アドレス) + 0x4a0 (仮想アドレスの中央 10 ビット、2 ビット左にシフト) = 0xdf2a4a0
メモリからの PTE の読み取りは次のとおりです。
0x324236 = 0000 0000 0011 0010 0100 (最初の 20 桁、PPN、16 進数は 0x00324) 0010 0011 0110 (有効な桁は 0)
有効ビットが 0 であるため、変換は失敗し、失敗した PTE アドレスは 0xdf2a4a0 になります。
(2)0x0a32fcd0
最初の 20 桁は次のとおりです: 000010100011001011 (TLBT) 11 (TLBI)
- TLBI: 3
- TLBT:028cb
TLB を確認してください。TLBT に一致するエントリはありません。ヒットしません。メモリ内で偏微分方程式を見つける必要があります:
PDEADDR = 0x45d000 + 0x0a0 (仮想アドレスの最初の 10 ビット、2 ビット左にシフト) = 0x45d0a0
メモリからの PDE の読み取りは次のとおりです。
0x000c3297 = 0000 0000 0000 1100 0011 (最初の 20 ビット、レベル 2 ページ テーブルのベース アドレス、16 進数は 0x000c3) 0010 1001 0111 (有効ビットは 1)
PTEADDR = 0x000c3000 (レベル 2 ページ テーブルのベース アドレス) + 0xcbc (仮想アドレスの中央 10 ビット、2 ビット左にシフト) = 0xc3cbc
メモリからの PTE の読み取りは次のとおりです。
34abd237 = 0011 0100 1010 1011 1101 (最初の 20 桁、PPN、16 進数は 0x34abd) 0010 0011 0111 (有効な桁は 1)
物理アドレスは次のとおりです。
PPN + PPO = 0x34abd000 + cd0 = 0x34abdcd0
(3)0x0d4182c0
最初の 20 桁は次のとおりです: 000011010100000110 (TLBT) 00 (TLBI)
- TLBI: 0
- TLBT:03506
TLB にこのエントリがあり、有効ビットは 1 です。TLB がヒットし、物理ページ番号は 0x98f8a です。
物理アドレスは次のとおりです。
PPN + PPO = 0x98f8a000 + 2c0 = 0x98f8a2c0