52
ハハハハハハ

ハードウェア

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: ハードウェア

ハードウェア

Page 2: ハードウェア

デジタル回路• 組み合わせ回路

– 状態を持たないデジタル回路– Mビットの入力に対して

Nビットの出力を与える関数(ブール関数)• ビット --- 0または1

• 順序回路– 状態(メモリ)を持つデジタル回路– クロックに同期して状態を遷移させる。– Kビットの状態を持ち、

Mビットの入力に対してNビットを出力

Page 3: ハードウェア

組み合わせ回路

Nビッ

の入力

Mビッ

の出力

Page 4: ハードウェア

順序回路

Nビッ

の入力

Mビッ

の出力

Kビットのメモリ

組み合わせ回路

クロック

Kビッ

の前状態

Kビッ

の次状態

実際にはメモリと組み合わせ回路は混在している。

Page 5: ハードウェア

MOSトランジスタ

P基盤

N N

ソースゲート

ドレイン金属

酸化膜

N基盤

PP

ドレインゲート

ソース

S D

S D

NMOS PMOS

MetalOxideSemiconductor

Page 6: ハードウェア

P基盤

N N

N基盤

PP

+ー

- ----

+ +++

ー+

電子 ホール

MOSトランジスタNMOS PMOS

Page 7: ハードウェア

CMOS

S D

D S

NMOS PMOS

IN

OUT

インバータ

ComplementaryMOS

Page 8: ハードウェア

CMOS

S D

D S

NMOS PMOS

ー電子

Page 9: ハードウェア

CMOS

S D

D S

NMOS PMOS

+ ホール

Page 10: ハードウェア

CMOSによるNANDゲート

PMOS

NMO

A B Y+ + -

+ - +

- + +

- - +

真理値表

+…1ー…0

Page 11: ハードウェア

組み合わせ回路

• 任意の組み合わせ回路は、原理的には、NANDゲートを組み合わせて構成できる。– エンコーダ・デコーダ– アダー– マルチプレクサ

• ただし、様々な制限がある。– 一つのゲートの出力数(ファン・アウト)は

制限される。(入力数はファン・インという。)

– ゲートの入力と出力の間には時間遅れがある。

Page 12: ハードウェア

SRフリップフロップS

S R Q Q禁止 禁止 禁止 禁止0 1 1 01 0 0 11 1 記憶 記憶

Page 13: ハードウェア

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

Clock

Page 14: ハードウェア

クロック

• 順序回路はクロックに同期して動いている。• 例えば、

– クロックが1のときに入力や前状態を読み込み、クロックが0のときに一斉に次状態へ遷移する。

Page 15: ハードウェア

エッジトリガのフリップフロップ

Clock

D

Q

Q

D Q

QCLK

Q

Clock

D

Page 16: ハードウェア

順序回路

• 結局、コンピュータは巨大な順序回路である。

• 特に、CPUは順序回路– クロックに従って、メモリから命令を読み出し、

それを組み合わせ回路によってデコードし、その結果に従って計算し、レジスタへの書き込みなどを行う。

– CPU内の様々なレジスタがCPUの状態を構成する。

Page 17: ハードウェア

順序回路(再び)

Nビッ

の入力

Mビッ

の出力

Kビットのメモリ

組み合わせ回路

クロック

Kビッ

の前状態

Kビッ

の次状態

実際にはメモリと組み合わせ回路は混在している。

Page 18: ハードウェア

DRAM

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

ワード線

ビット線

DynamicRandomAccessMemory

Page 19: ハードウェア

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

Page 20: ハードウェア

コンピュータアーキテクチャ• コンピュータの構成法• 電子部品をどのように組み合わせて、

コンピュータのハードウェアを構成するか。

• 特に、 CPU ( Central Processing Unit )の構成法と機械語命令の設計

• しかし、ソフトウェア– オペレーティングシス– 言語処理系

と独立には語れない。

Page 21: ハードウェア

計算機の基本アーキテクチャ

CPU

データメモリ

プログラムメモリ

入出力装置

CPU

メモリ

入出力装置

データ

プログラム

ハーバードアーキテクチャ フォンノイマンアーキテクチャ

Self Modifying Code は不可能インデクスレジスタの使用

Self Modifying Code を実現自己修飾によるプログラム構造の実現

平木

Page 22: ハードウェア

命令

命令

命令命令

メモリ

レジスタシステムレジスタ

条件分岐T F

命令実行の基本形態

命令命令命令

データ

R0R1R2

平木

Page 23: ハードウェア

計算機の内部基本構成

プログラムカウンタメモリ

命令

命令レジスタ

演算器(群)+- ×÷

制御回路

入出力機器

メモリバ

データ

CPU

IOブリッジ

レジスタ

平木

Page 24: ハードウェア

機械語命令• 入力オペランド(メモリ、レジスタ)の指定 (通常、2個

以下)– オペランドのアドレス(の一部)– アドレシングモード– 即値– アドレス修飾(インデクス等)

• オペランドに対する操作(演算器の指定等)• 暗黙オペランドに対する操作• 出力オペランド(メモリ、レジスタ)の指定 (通常1個)• オペランド指定方式の指示• 次に実行する命令(アドレス)の 決定

– 次命令 番地– 無条件に分岐– 条件分岐(分岐条件の指定と、分岐先の指定)

ハードウェアの持つ全能力の操作指定

平木

Page 25: ハードウェア

命令形式• オペランドメモリ、レジスタ、システムレジスタ、

即値、スタック、キュー• 命令長

– 固定長 データ基本長 = 命令長ならば、即値に問題– 可変長 パイプライン設計の困難、命令シーケンス

• オペランド数– 4 入力1、入力2、出力、次アドレス– 3 入力1、入力2、出力   + 分岐命令– 2 入力1、入出力2 + 分岐命令、 MOV 命令– 1 入出力 + アキュムレータ + 分岐命令– 0 オペランドはスタックトップ  (スタック計算

機)  

平木

Page 26: ハードウェア

メモリのアドレス付け• バイトアドレス  → アラインメント問題• ワードアドレス  → 文字列の扱い

• 均一アドレス → 命令オーバーヘッド小• セグメント拡張アドレス → アドレス指定幅小

• 多彩なアドレシングモード  – アドレス計算に要する命令数の減少– クリーンなコードの生成

平木

Page 27: ハードウェア

X86概説

阿倍

Page 28: ハードウェア

Intel X86 プロセッサ• Intel 32 ビット CPU: 386, 486, Pentium, ... の総称

– 8086 ( 16 ビット)の拡張(仮想記憶、メモリ保護、タスク管理)

• CISC アーキテクチャ– 豊富なアドレッシングモードと命令– 命令のエンコーディングは可変長で複雑

• 貧弱でくせのあるレジスタ群– 汎用的に使えるレジスタは 6 個– レジスタアロケーションはシビア

• 最も多く使われている CPU– ソフト面の互換性を保った高速化の企業努力

• 386 – 8086 のコードが実行可能 (仮想 86 モード)• 486 – 整数演算のパイプライン化、内臓浮動小数点ユニット• Pentium – 予測分岐、スーパースカラ• Pentium Pro – 命令を単純な命令列に変換、内部的に RISC

阿倍

Page 29: ハードウェア

動作モード

Virtual 8086

ProtectedReal

リアルモード 保護モード

Reset

• 古い OS 用– MS-DOS 等– メモリ保護なし– 16 ビットアドレス空

• 現代的 OS 用– Windows, Linux, ...– メモリ保護、仮想記

憶– 32 ビットアドレス空間

阿倍

Page 30: ハードウェア

保護モードで不可能なこと

• 書き込み禁止セグメントへの書き込み• 読み取り禁止コードセグメントの覗き• コードセグメントの変更(自己改変コー

ド)• データセグメントの内容を命令として実行• セグメント以外の領域へのアクセス• コード、データセグメントをスタックにす

阿倍

Page 31: ハードウェア

内部構成(80386)

BusInterface

CodePrefetch

InstructionDecoder32 bits

Data Bus

Address Bus

real address real address

PagingUnit

SegmentUnit

ExecutionUnit

linear address

阿倍

Page 32: ハードウェア

レジスタ群

GDTR

IDTR

LDTR

TR

EAX

EBX

ECX

EDX

ESI

EDI

EBP

ESP

CS

SS

DS

ES

FS

GS

DR0

DR1

DR2

DR3

DR4

DR5

DR6

DR7

CR0

CR1

CR2

CR3

EFLAGS

EIP

汎用レジスタ

セグメントレジスタ

フラグレジスタ

命令ポインタシステムアドレスレジスタ

デバッグレジスタ

コントロールレジスタ

ユーザプログラムが使用

OS が使用

CS

SS

DS

ES

FS

GS

ディスクリプタレジスタ

阿倍

Page 33: ハードウェア

汎用レジスタの詳細

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

31 15 0 15 07

16ビットサブレジスタ

8ビットサブレジスタ

ESP はスタックポインタ、 EBP はフレームポインタとして使われる。

阿倍

Page 34: ハードウェア

セグメント(1)• プログラムを種類別にまとめた、連続するメモリ

– テキストセグメント - プログラムのコード• 通常書き込み禁止

– データセグメント - プログラムが参照するデータ• さらに初期値の有無、書込み禁止属性等で細分

– スタックセグメント - スタック• セグメントのサイズは一定ではない

– 仮想記憶機構におけるページの概念とは対照的• X86 はセグメントとページの両方をサポート

– それぞれ Segment Unit 、  Paging Unit が処理– 両方にメモリ保護の概念がある(矛盾したら厳しい方)– 8086 との互換性のため(やむなく)サポートされた

が、 386 では拡張され、すぐれたメモリ保護機能を提供

阿倍

Page 35: ハードウェア

セグメント(2)

Segment

Register

Offset

( 16 bits )

Segment

Register

Offset

( 32 bits )

8086 / 80386 (リアルモード)

80386 (保護モード)

SegmentUnit

<< 4(* 16)

++

Real address (20 bits) Linear address (32 bits)

(20 bits) (32 bits)

Descripter Table •address•size•properties

(16 bits) (16 bits)

阿倍

Page 36: ハードウェア

X86 命令形式の概要• データ移動

– mov? src, dst  ( ? はデータ型  b,w,l  等の修飾)– src, dst の一方のみメモリオペランド可

• 算術演算– add? src, dst ( dst += src ) という2オペランド命令– src, dst の一方のみメモリオペランド可

• 分岐– 比較命令  cmp? src1, src2 により  src2 – src1 の結果をフ

ラグレジスタに記録し、– 条件分岐 j? dst  ( je (==), jne (!=), jl (<), 等)で結果に

より分岐– src1, src2 の一方のみメモリオペランド可

阿倍

Page 37: ハードウェア

データ移動の例 int i, j, *p, v[10]; char c, s[10];

● i = 123; j = i;movl $123,imovl i,%eaxmovl %eax,j

● j = *p;movl p,%eaxmovl (%eax),%ebx ; EBX = *(int*)EAXmovl %ebx,j

● j = *(p+1);movl p,%eaxmovl 4(%eax),%ebx ; EBX = *(int*)(4 + EAX)movl %ebx,j

● j = v[i];movl i,%eaxmovl v(,%eax,4),%ebx ; EBX = *(int*)((int)v + EAX * 4)movl %ebx,j

● c = s[i+j*8];movl i,%eaxmovl j,%ebxmovb s(%eax,%ebx,8),%cl ; CL = *(char*)((int)s + EAX + EBX * 8)movb %cl,c

阿倍

Page 38: ハードウェア

間接アドレッシングのまとめ

• 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)

阿倍

Page 39: ハードウェア

算術演算の例 int i, j, k, v[10]; unsigned int l, m, n;

● i = j+k;movl j,%eaxaddl k,%eax ; EAX += kmovl %eax,i

● v[i] += j;movl i,%eaxmovl j,%ebxaddl %ebx,v(,%eax,4) ; *(int*)((int)v + EAX * 4) += EBX

● v[i]++;movl i,%eaxincl v(,%eax,4) ; *(int*)((int)v + EAX * 4) ++

● i = j / k;movl j,%eaxcdq ; EAX を「 64 bit レジスタ」 EDX:EAX に符号拡張idivl k   ; 符号付の EDX:EAX /= k 、商 =EAX 剰余=EDXmovl %eax,i

● l = m % n;movl m,%eax ; EAX をmovl $0,%edx ; EDX:EAX にゼロ拡張divl n        ; 符号なしの EDX:EAX /= n 、商 =EAX 剰余=EDXmovl %edx, l

阿倍

Page 40: ハードウェア

分岐の例

int i, j;

● goto L1;jmp L1 ; 無条件ジャンプ

● if (i < j) goto L2;    L2:

movl i,%eaxcmpl j,%eax ; EAX(i) と j の比較をフラグに記録jl L2 ; 符号付比較で「<」なら L2 へジャンプ

● 条件ジャンプ命令のまとめ

je ==jne !=

符号付比較 符号なし比較jl < jb <jle <= jbe <=jg > ja >jge >= jae >=

阿倍

Page 41: ハードウェア

関数呼び出し規約

• ESP をスタックポインタとして使用• EBP をフレームポインタとして使用• 引数を右から順にスタックにプッシュ• 関数を呼び出す• 呼ばれた関数は EBP,EDI,ESI,EBX を破壊して

はならない ( Callee Save Registers )• 戻り値を EAX に入れ、呼び出し側に戻る• 最後に呼び出し側がスタックを(引数分)戻す

阿倍

Page 42: ハードウェア

フレームの構造

local

variables

saved EBP

saved EDI

saved ESI

saved EBX

return addr

incoming

arguments

caller’s frame

ESP

EBP

Callee Save レジスタのセーブエリア

呼び出し側がプッシュした戻り番地

呼び出し側がプッシュした関数引数EBP からの正のオフセットでアクセス

EBP からの負のオフセットでアクセス

阿倍

Page 43: ハードウェア

コーリングシーケンスint bar(int x){int i=x; return i;}

int i;

saved EBP

saved EDI

return addr

int x = 123;

foo’s frame

foo:

pushl $1 ; 引数をプッシュ

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   ; ポップした戻り番地へジャンプ

int foo(){return bar(1);}

bar’s frame

EBP+12

EBP

ESP

阿倍

Page 44: ハードウェア

命令エンコーディング(1)

prefix 0 - 1 命令全体の修飾address size 0 - 1 0x67 があれば 16 なければ 32 ビッ

トoperand size 0 - 1 0x66 があれば 16 なければ 32 ビッ

トsegment override 0 - 1 デフォルト以外のセグメントの指定opcode 1 - 2 命令コードmod-reg-r/m 0 - 1 アドレッシングモードを定めるscaled index base byte (SIB)

0 - 1 ベースレジスタ、インデックスレジスタ、スケーリング値(* 1 、* 2 、* 4 、* 8 )

displacement 0 - 4 アドレス(オフセット)immediate 0 - 4 即値

バイト数

フィールド名 目的

阿倍

Page 45: ハードウェア

命令エンコーディング(2)

movl (%ebx), %edx => 8B13

opcode=8B mod-reg-r/m=13(00 010 011)

addl %eax, %ecx => 03C8

opcode=03 mod-reg-r/m=C8(11 001 000)

addl (%ebx, %ecx, 4), %eax => 03048B

opcode=03 mod-reg-r/m=04(00 000 100) SIB=8B(10 001 011)

SIB あり

阿倍

Page 46: ハードウェア

命令実行の基本フェーズ• 命令フェッチ( F or IF )

– PCに従い、メモリから命令読み出しIRに入れる

• 命令デコード(D)– IRにある命令を解釈し、

以下の動作を決定する

• オペランド読み出し(R)– 命令に従い、レジスタ等のオペランド

を読み出す

• 実行(E  or EX)– 演算器、メモリアクセスなどを用いて

命令の動作を実現する

• オペランド書き込み(W)

WPC: Program CounterIR: Instruction Register (萩谷)

平木

Page 47: ハードウェア

CPU の内部構造平木

Page 48: ハードウェア

マイクロプログラム 平木

Page 49: ハードウェア

仮想記憶とアドレス変換• ユーザのアドレスを物理的なメモリと分離

– 論理アドレスから物理アドレスへの変換• ディスクをユーザの記憶空間の一部として利用• メモリの保護等の属性の利用• ユーザ内、ユーザ間のメモリの共有

未使用

平木

MMU:MemoryManagementUnit (萩谷)

Page 50: ハードウェア

アドレス変換方式• ページング

– メモリ空間を固定サイズ(ページ)に分割– ページ毎に論理ページアドレスと物理ページアドレスを写像– PMT (Page Mapping Table) の使用

• セグメンテーション– メモリ空間を、ユーザが規定する可変サイズ(セグメント)

に分割

– セグメント毎に論理アドレスと物理アドレスを写像

• ページ化したセグメント方式– メモリは固定したページサイズで分割– ページの集合体をセグメントとして扱う– 多くのプロセッサで実現

• 多段の変換テーブルによる、効率の良い変換表の実現

平木

Page 51: ハードウェア

アドレス変換• Page Mapping Table による変換• 各エントリには物理アドレス、属性(保護等)

プロセスのページ表ポインタ

オフセット論理ページ番号

属性

物理ページ番号

メモリ

VI

平木

Page 52: ハードウェア

割込みとポーリング• 例:デバイスからの入力

– (仮定) Ready Flag, Data

ともにメモリ空間の一部として見える• ポーリング

– 命令で、 Ready Flag をレジスタに読み込み、条件分岐で入力を検出

• Busy Waiting Load と 条件分岐でループ• プログラム中の各所に検出個所を分散させることも可能• 大きな命令オーバーヘッド (他の仕事が出来ない場合も)

• 割込み    ポーリングをする専用ハードウェア– 毎クロック、 Ready Flag  を監視– Ready  になると、 CPU に通知して入力動作を起動

• 入出力における割込みは、– レスポンスを良くする– 命令オーバーヘッドを少なくする– プログラム要素を分離する

ために有益

CPU

Memory

Ready   Flag

Data

入力デバイス

平木