ハードウェア.

Similar presentations


Presentation on theme: "ハードウェア."— Presentation transcript:

1 ハードウェア

2 デジタル回路 組み合わせ回路 順序回路 状態を持たないデジタル回路 Mビットの入力に対して Nビットの出力を与える関数(ブール関数)
ビット --- 0または1 順序回路 状態(メモリ)を持つデジタル回路 クロックに同期して状態を遷移させる。 Kビットの状態を持ち、 Mビットの入力に対してNビットを出力

3 組み合わせ回路 Nビットの入力 Mビットの出力

4 順序回路 Mビットの出力 Nビットの入力 組み合わせ回路 Kビットの前状態 Kビットの次状態 Kビットの メモリ クロック 実際にはメモリと
組み合わせ回路は 混在している。 クロック

5 MOSトランジスタ NMOS PMOS ゲート ゲート ソース ドレイン ソース ドレイン 金属 酸化膜 N N P P P基盤 N基盤 G
Metal Oxide Semiconductor MOSトランジスタ NMOS PMOS ゲート ゲート ソース ドレイン ソース ドレイン 金属 酸化膜 P基盤 N基盤

6 MOSトランジスタ NMOS PMOS ー + + ー ー + N N P P P基盤 N基盤 電子 ホール - - - + + + - -

7 Complementary MOS CMOS IN NMOS PMOS OUT インバータ

8 CMOS NMOS PMOS 電子

9 CMOS NMOS PMOS ホール

10 CMOSによるNANDゲート PMOS 真理値表 NMOS +…1 ー…0

11 組み合わせ回路 任意の組み合わせ回路は、原理的には、 NANDゲートを組み合わせて構成できる。 ただし、様々な制限がある。
エンコーダ・デコーダ アダー マルチプレクサ ただし、様々な制限がある。 一つのゲートの出力数(ファン・アウト)は 制限される。(入力数はファン・インという。) ゲートの入力と出力の間には時間遅れがある。

12 SRフリップフロップ 禁止 記憶

13 同期型SRフリップフロップ Clock

14 クロック 順序回路はクロックに同期して動いている。 例えば、 クロックが1のときに入力や前状態を読み込み、
順序回路はクロックに同期して動いている。 例えば、 クロックが1のときに入力や前状態を読み込み、 クロックが0のときに一斉に次状態へ遷移する。

15 エッジトリガのフリップフロップ D Q CLK Q Q Q Clock Clock D D Q

16 順序回路 結局、コンピュータは巨大な順序回路である。 特に、CPUは順序回路 クロックに従って、メモリから命令を読み出し、
それを組み合わせ回路によってデコードし、 その結果に従って計算し、 レジスタへの書き込みなどを行う。 CPU内の様々なレジスタが CPUの状態を構成する。

17 順序回路(再び) Mビットの出力 Nビットの入力 組み合わせ回路 Kビットの前状態 Kビットの次状態 Kビットの メモリ クロック
実際にはメモリと 組み合わせ回路は 混在している。 クロック

18 DRAM ワード線 DRAMでは、 コンデンサの電荷によって データを記憶し、 MOSで読み書きする。 一定時間内に、
Dynamic Random Access Memory DRAM ワード線 DRAMでは、 コンデンサの電荷によって データを記憶し、 MOSで読み書きする。 一定時間内に、 リフレッシュ(読んだデータを そのまま書く)しなければ データが失われる。 ビット線

19 コンピュータ・アーキテクチャ

20 コンピュータアーキテクチャ コンピュータの構成法 電子部品をどのように組み合わせて、 コンピュータのハードウェアを構成するか。
特に、CPU(Central Processing Unit)の 構成法と機械語命令の設計 しかし、ソフトウェア オペレーティングシス 言語処理系 と独立には語れない。

21 計算機の基本アーキテクチャ フォンノイマンアーキテクチャ ハーバードアーキテクチャ プログラム メモリ CPU 入出力装置 CPU メモリ
平木 計算機の基本アーキテクチャ プログラム メモリ CPU 入出力装置 CPU メモリ 入出力装置 プログラム データ データメモリ フォンノイマンアーキテクチャ ハーバードアーキテクチャ Self Modifying Code は不可能 インデクスレジスタの使用 Self Modifying Code を実現 自己修飾によるプログラム構造の実現

22 命令実行の基本形態 命令 命令 T F 命令 命令 メモリ レジスタ システムレジスタ 条件分岐 平木 命令 命令 命令 データ R0 R1

23 計算機の内部基本構成 CPU メモリバス メモリ 制御回路 レジスタ 演算器(群) +-×÷ IO ブリッジ 入出力機器 平木
プログラムカウンタ 命令 命令レジスタ 制御回路 レジスタ データ 演算器(群) +-×÷ IO ブリッジ 入出力機器

24 機械語命令 ハードウェアの持つ全能力の操作指定 入力オペランド(メモリ、レジスタ)の指定 (通常、2個以下)
平木 入力オペランド(メモリ、レジスタ)の指定 (通常、2個以下) オペランドのアドレス(の一部) アドレシングモード 即値 アドレス修飾(インデクス等) オペランドに対する操作(演算器の指定等) 暗黙オペランドに対する操作 出力オペランド(メモリ、レジスタ)の指定 (通常1個) オペランド指定方式の指示 次に実行する命令(アドレス)の決定 次命令番地 無条件に分岐 条件分岐(分岐条件の指定と、分岐先の指定) ハードウェアの持つ全能力の操作指定

25 命令形式 オペランド メモリ、レジスタ、システムレジスタ、 即値、スタック、キュー 命令長 オペランド数
平木 命令形式 オペランド メモリ、レジスタ、システムレジスタ、 即値、スタック、キュー 命令長 固定長 データ基本長 = 命令長ならば、即値に問題 可変長 パイプライン設計の困難、命令シーケンス オペランド数 4 入力1、入力2、出力、次アドレス 3 入力1、入力2、出力   + 分岐命令 2 入力1、入出力2 + 分岐命令、MOV命令 1 入出力 + アキュムレータ + 分岐命令 0 オペランドはスタックトップ  (スタック計算機)  

26 メモリのアドレス付け バイトアドレス → アラインメント問題 ワードアドレス → 文字列の扱い 均一アドレス → 命令オーバーヘッド小
平木 メモリのアドレス付け バイトアドレス  → アラインメント問題 ワードアドレス  → 文字列の扱い 均一アドレス → 命令オーバーヘッド小 セグメント拡張アドレス → アドレス指定幅小 多彩なアドレシングモード   アドレス計算に要する命令数の減少 クリーンなコードの生成

27 阿倍 X86概説

28 Intel X86 プロセッサ Intel 32 ビット CPU: 386, 486, Pentium, ... の総称
阿倍 Intel 32 ビット CPU: 386, 486, Pentium, ... の総称 8086 (16 ビット)の拡張(仮想記憶、メモリ保護、タスク管理) CISC アーキテクチャ 豊富なアドレッシングモードと命令 命令のエンコーディングは可変長で複雑 貧弱でくせのあるレジスタ群 汎用的に使えるレジスタは 6 個 レジスタアロケーションはシビア 最も多く使われている CPU ソフト面の互換性を保った高速化の企業努力 386 – 8086 のコードが実行可能 (仮想 86 モード) 486 – 整数演算のパイプライン化、内臓浮動小数点ユニット Pentium – 予測分岐、スーパースカラ Pentium Pro – 命令を単純な命令列に変換、内部的にRISC

29 動作モード 古い OS 用 現代的 OS 用 MS-DOS 等 メモリ保護なし 16 ビットアドレス空間
阿倍 リアルモード 保護モード Real Protected Reset Virtual 古い OS 用 MS-DOS 等 メモリ保護なし 16 ビットアドレス空間 「Real モード」は80386 の通常のモードではない。 矢印に対応するモード遷移命令があるが、詳細は略。 Virtual 8086 (仮想 86 モード)モードは、保護モード下での 1 プロセスとして 8086 のコードを実行するもの。 現代的 OS 用 Windows, Linux, ... メモリ保護、仮想記憶 32 ビットアドレス空間

30 保護モードで不可能なこと 書き込み禁止セグメントへの書き込み 読み取り禁止コードセグメントの覗き コードセグメントの変更(自己改変コード)
阿倍 保護モードで不可能なこと 書き込み禁止セグメントへの書き込み 読み取り禁止コードセグメントの覗き コードセグメントの変更(自己改変コード) データセグメントの内容を命令として実行 セグメント以外の領域へのアクセス コード、データセグメントをスタックにする 8086 では不評だったセグメントを、386 では自然に拡張することで、セグメント単位での細かな制御が可能となった。

31 内部構成 (80386) 32 bits Data Bus Bus Interface Code Prefetch Instruction
阿倍 内部構成 (80386) Data Bus Bus Interface Code Prefetch Instruction Decoder 32 bits Address Bus セグメントレジスタに従い Segment Unit で変換されたアドレスをリニアアドレスという。Paging Unit は仮想記憶機構を サポートし、リニアアドレスを実アドレスに変換する。Paging Unit を使わない場合はリニアアドレスが実アドレス。 real address real address Paging Unit Segment Execution linear address

32 レジスタ群 ユーザプログラムが使用 OS が使用 フラグレジスタ システムアドレスレジスタ 命令ポインタ 汎用レジスタ コントロールレジスタ
阿倍 ユーザプログラムが使用 OS が使用 EAX EBX ECX EDX ESI EDI EBP ESP EFLAGS GDTR IDTR LDTR TR フラグレジスタ EIP システムアドレスレジスタ 命令ポインタ DR0 DR1 DR2 DR3 DR4 DR5 DR6 DR7 CR0 CR1 CR2 CR3 汎用レジスタ 汎用レジスタ、フラグレジスタ、命令ポインタは 32 bit レジスタであり、8086 の 16 ビットレジスタを「拡張」したもの。 セグメントレジスタ、ディスクリプタレジスタは後述。 システムアドレスレジスタは仮想記憶とマルチタスクの管理情報を保持。GDTR/LDTR – セグメントディスクリプタテーブル、 IDTR – 割り込みベクタ、TR – カレントタスク情報。 コントロールレジスタは CPU の状態(e.g.動作モード変更、ページング有無)の制御用。 デバッグレジスタはデバッガサポート(ブレークポイントと条件)。 CS SS DS ES FS GS CS SS DS ES FS GS コントロールレジスタ デバッグレジスタ セグメントレジスタ ディスクリプタレジスタ

33 汎用レジスタの詳細 16ビットサブレジスタ 8ビットサブレジスタ 31 15 15 7
阿倍 汎用レジスタの詳細 16ビットサブレジスタ 8ビットサブレジスタ 31 15 15 7 EAX EBX ECX EDX ESI EDI EBP ESP AX BX CX DX SI DI BP SP AX BX CX DX AH AL BH BL CH CL DH DL 16ビットサブレジスタは 8086 のレジスタ。 ESP はスタックポインタ、EBP はフレームポインタとして使われる。

34 セグメント(1) プログラムを種類別にまとめた、連続するメモリ セグメントのサイズは一定ではない
阿倍 プログラムを種類別にまとめた、連続するメモリ テキストセグメント - プログラムのコード 通常書き込み禁止 データセグメント - プログラムが参照するデータ さらに初期値の有無、書込み禁止属性等で細分 スタックセグメント - スタック セグメントのサイズは一定ではない 仮想記憶機構におけるページの概念とは対照的 X86 はセグメントとページの両方をサポート それぞれ Segment Unit、 Paging Unit が処理 両方にメモリ保護の概念がある(矛盾したら厳しい方) 8086 との互換性のため(やむなく)サポートされたが、386 では拡張され、すぐれたメモリ保護機能を提供 セグメントとページの保護指定が矛盾する場合は、「厳しい方」を採用する。

35 セグメント(2) 8086 / 80386 (リアルモード) 80386 (保護モード) + + Segment Register
阿倍 セグメント(2) 8086 / (リアルモード) 80386 (保護モード) Segment Register Offset (16 bits) Segment Register Offset (32 bits) (16 bits) (16 bits) Descripter Table address size properties << 4 (* 16) Segment Unit セグメントレジスタは 16 bit 長で、リアルモードでは8086 のセグメントレジスタの意味を持つが、保護モード下では セレクタと呼ばれ、セグメントディスクリプタテーブルのインデックスとして使われる。 ディスクリプタレジスタはそのキャッシュ。 + + (20 bits) (32 bits) Real address (20 bits) Linear address (32 bits)

36 X86 命令形式の概要 データ移動 算術演算 分岐 mov? src, dst (? はデータ型 b,w,l 等の修飾)
阿倍 X86 命令形式の概要 データ移動 mov? src, dst (? はデータ型 b,w,l 等の修飾) src, dst の一方のみメモリオペランド可 算術演算 add? src, dst (dst += src) という2オペランド命令 分岐 比較命令 cmp? src1, src2 により src2 – src1 の結果をフラグレジスタに記録し、 条件分岐 j? dst  (je (==), jne (!=), jl (<), 等)で結果により分岐 src1, src2 の一方のみメモリオペランド可 注意: 様々なアセンブラがあり、表記もかなり異なる。ここでは GAS (GNU Assembler) に従う。

37 データ移動の例 int i, j, *p, v[10]; char c, s[10]; movl $123,i movl i,%eax
阿倍 int i, j, *p, v[10]; char c, s[10]; ● i = 123; j = i; movl $123,i movl i,%eax movl %eax,j ● j = *p; movl p,%eax movl (%eax),%ebx  ; EBX = *(int*)EAX movl %ebx,j ● j = *(p+1); movl 4(%eax),%ebx  ; EBX = *(int*)(4 + EAX) ● j = v[i]; movl v(,%eax,4),%ebx  ; EBX = *(int*)((int)v + EAX * 4) ● c = s[i+j*8]; movl j,%ebx movb s(%eax,%ebx,8),%cl  ; CL = *(char*)((int)s + EAX + EBX * 8) movb %cl,c

38 間接アドレッシングのまとめ disp(basereg,indexreg,index) index の省略は 1 他の省略は 0
阿倍 間接アドレッシングのまとめ disp(basereg,indexreg,index) *(Type *)(disp + basereg + indexreg * index) disp はリンカが解決できる定数式 index は 1, 2, 4, 8 のいずれか index の省略は 1 他の省略は 0 (basereg,indexreg,index) (basereg,indexreg) (,indexreg,index) (basereg)

39 算術演算の例 int i, j, k, v[10]; unsigned int l, m, n; movl j,%eax
阿倍 int i, j, k, v[10]; unsigned int l, m, n; ● i = j+k; movl j,%eax addl k,%eax ; EAX += k movl %eax,i ● v[i] += j; movl i,%eax movl j,%ebx addl %ebx,v(,%eax,4) ; *(int*)((int)v + EAX * 4) += EBX ● v[i]++; incl v(,%eax,4) ; *(int*)((int)v + EAX * 4) ++ ● i = j / k; cdq ; EAX を「64 bit レジスタ」EDX:EAX に符号拡張 idivl k   ; 符号付の EDX:EAX /= k 、商=EAX 剰余=EDX ● l = m % n; movl m,%eax ; EAX を movl $0,%edx ; EDX:EAX にゼロ拡張 divl n      ; 符号なしの EDX:EAX /= n 、商=EAX 剰余=EDX movl %edx, l

40 分岐の例 int i, j; jmp L1 ; 無条件ジャンプ L2: movl i,%eax
阿倍 int i, j; ● goto L1; jmp L1 ; 無条件ジャンプ ● if (i < j) goto L2;    L2: movl i,%eax cmpl j,%eax ; EAX(i) と j の比較をフラグに記録 jl L2 ; 符号付比較で「<」なら L2 へジャンプ ● 条件ジャンプ命令のまとめ je == jne != 符号付比較 符号なし比較 jl < jb < jle <= jbe <= jg > ja > jge >= jae >=

41 関数呼び出し規約 ESP をスタックポインタとして使用 EBP をフレームポインタとして使用 引数を右から順にスタックにプッシュ
阿倍 関数呼び出し規約 ESP をスタックポインタとして使用 EBP をフレームポインタとして使用 引数を右から順にスタックにプッシュ 関数を呼び出す 呼ばれた関数は EBP,EDI,ESI,EBX を破壊してはならない (Callee Save Registers) 戻り値を EAX に入れ、呼び出し側に戻る 最後に呼び出し側がスタックを(引数分)戻す ここでは C 言語の関数、ローカル変数、コーリングシーケンスの規約について説明する。

42 フレームの構造 EBP からの負のオフセットでアクセス Callee Save レジスタのセーブエリア 呼び出し側がプッシュした戻り番地
阿倍 フレームの構造 ESP EBP EBP からの負のオフセットでアクセス local variables saved EBP saved EDI saved ESI saved EBX return addr incoming arguments caller’s frame Callee Save レジスタのセーブエリア 呼び出し側がプッシュした戻り番地 実際には関数内で破壊される Callee Save レジスタのみをセーブすればよい。 呼び出し側がプッシュした関数引数 EBP からの正のオフセットでアクセス

43 コーリングシーケンス int foo(){return bar(1);}
阿倍 コーリングシーケンス int foo(){return bar(1);} int bar(int x){int i=x; return i;} foo: pushl $ ; 引数をプッシュ call bar ; 戻り番地をプッシュし          ; bar へジャンプ addl $4,%esp ; スタックを戻す ret bar: pushl %edi ; EDI をプッシュ pushl %ebp ; EBP をプッシュ movl %esp,%ebp ; フレームを確保 subl $4,%esp ; i のアロケート movl 12(%ebp),%edi ; EDI = x movl %edi,-4(%ebp) ; i = EDI movl -4(%ebp),%eax ; EAX = i movl %ebp,%esp ; i を破棄 popl %ebp ; EBP をポップ popl %edi ; EDI をポップ ret   ; ポップした戻り番地へジャンプ bar’s frame ESP int i; saved EBP saved EDI return addr int x = 123; foo’s frame EBP EBP+12

44 命令エンコーディング(1) prefix 0 - 1 命令全体の修飾 address size
阿倍 フィールド名 バイト数 目的 prefix 0 - 1 命令全体の修飾 address size 0x67 があれば 16 なければ 32 ビット operand size 0x66 があれば 16 なければ 32 ビット segment override デフォルト以外のセグメントの指定 opcode 1 - 2 命令コード mod-reg-r/m アドレッシングモードを定める scaled index base byte (SIB) ベースレジスタ、インデックスレジスタ、 スケーリング値(*1、*2、*4、*8) displacement 0 - 4 アドレス(オフセット) immediate 即値 この順にバイトが並ぶ。

45 命令エンコーディング(2) addl %eax, %ecx => 03C8
阿倍 addl %eax, %ecx => 03C8 opcode=03 mod-reg-r/m=C8( ) movl (%ebx), %edx => 8B13 opcode=8B mod-reg-r/m=13( ) アドレッシングモードは mod-reg-r/m の mod と r/m の組み合わせで定まる。 addl (%ebx, %ecx, 4), %eax => B opcode=03 mod-reg-r/m=04( ) SIB=8B( ) SIB あり

46 命令実行の基本フェーズ 命令フェッチ(F or IF) 命令デコード(D) オペランド読み出し(R) 実行(E or EX)
平木 命令フェッチ(F or IF) PCに従い、メモリから命令読み出し IRに入れる 命令デコード(D) IRにある命令を解釈し、 以下の動作を決定する オペランド読み出し(R) 命令に従い、レジスタ等のオペランドを 読み出す 実行(E or EX) 演算器、メモリアクセスなどを用いて 命令の動作を実現する オペランド書き込み(W) PC: Program Counter IR: Instruction Register (萩谷)

47 CPUの内部構造 平木

48 平木 マイクロプログラム

49 仮想記憶とアドレス変換 ユーザのアドレスを物理的なメモリと分離 論理アドレスから物理アドレスへの変換
平木 仮想記憶とアドレス変換 ユーザのアドレスを物理的なメモリと分離 論理アドレスから物理アドレスへの変換 ディスクをユーザの記憶空間の一部として利用 メモリの保護等の属性の利用 ユーザ内、ユーザ間のメモリの共有 未使用 MMU: Memory Management Unit(萩谷)

50 アドレス変換方式 ページング セグメンテーション ページ化したセグメント方式 メモリ空間を固定サイズ(ページ)に分割
平木 ページング メモリ空間を固定サイズ(ページ)に分割 ページ毎に論理ページアドレスと物理ページアドレスを写像 PMT(Page Mapping Table)の使用 セグメンテーション メモリ空間を、ユーザが規定する可変サイズ(セグメント)に 分割 セグメント毎に論理アドレスと物理アドレスを写像 ページ化したセグメント方式 メモリは固定したページサイズで分割 ページの集合体をセグメントとして扱う 多くのプロセッサで実現 多段の変換テーブルによる、効率の良い変換表の実現

51 アドレス変換 Page Mapping Table による変換 各エントリには物理アドレス、属性(保護等) メモリ 平木 V V I
論理ページ番号 オフセット メモリ プロセスのページ表ポインタ 物理ページ番号 属性

52 割込みとポーリング 例:デバイスからの入力 ポーリング 割込み ポーリングをする専用ハードウェア 入出力における割込みは、 ために有益
平木 Ready Flag 入力デバイス 例:デバイスからの入力 (仮定)Ready Flag, Data ともにメモリ空間の一部として見える ポーリング 命令で、Ready Flagをレジスタに 読み込み、条件分岐で入力を検出 Busy Waiting Load と 条件分岐でループ プログラム中の各所に検出個所を分散させることも可能 大きな命令オーバーヘッド (他の仕事が出来ない場合も) 割込み    ポーリングをする専用ハードウェア 毎クロック、Ready Flag を監視 Ready になると、CPUに通知して入力動作を起動 入出力における割込みは、 レスポンスを良くする 命令オーバーヘッドを少なくする プログラム要素を分離する ために有益 CPU Memory Data


Download ppt "ハードウェア."

Similar presentations


Ads by Google