☆microcomputer
□MCU(Microcontroller unit)
◎Intel
◆8048
◆8051
_◇ファミリ
8051 4K ROM 128 RAM
_◇メモリ
プログラム空間、RAM空間分離、各64KB
プログラム、RAMとも下から配置
うちRAM空間の80H~0FFHにSFR等
※ビットアドレシング可能な空間があり、SFRの多くが割り当てられている。
_◇レジスタ
レジスタの多くもSFRにマップされている
A 0E0h
アキュムレータ
B 0F0h
乗除算で使われる他は単なるレジスタ
PSW 0D0h
7 CY
6 AC(BCD用キャリ)
5 F0(User開放)
4 RS1
3 RS0
ワークレジスタ選択
00 … Bank 0 (00h-07h)
01 … Bank 1 (08h-0Fh)
10 … Bank 2 (10h-17h)
11 … Bank 3 (18h-1Fh)
2 OV
1 (reserved)
0 Parity(Aのビットの1の数がイーブン)
SP 81h
07hに初期化される。
DPTR DPH=83h, DPL=82h
16ビットのアドレスを保持
P0 80h
ポート0
P1 90h
ポート1
P2 0A0h
ポート2
P3 0B0h
ポート3
IP 0B8h
Interrupt Priority Control
IE 0A8h
Interrupt Enabel Control
TMOD 89h
Timer/Counter Mode Control
TCON 88h
Timer/Conuter Control
TH0 8Ch
TL0 8Ah
TH1 8Dh
TL1 8Bh
SCON 98h
Serial Control
SBUF 99h
Serial Data Buff
PCON 87h
Power Control
◆8061
◆8096
◆i960
◎Motorolla, NXP
◎TI
◎ST Microelectronics
◎MicroChip
◆PIC12F675
データメモリ Bank0 0x20-0x5F番地
プログラムメモリ 0x000-0x3FF番地
_◇端子
8ピン
1: VDD
2: GP5/T1CKI/OSC1/CLKIN
3: GP4/AN3/TIG#/OSC2/CLKOUT
4: GP3/MCLR#/Vpp
5: GP2/AN2/T0CKI/INT/COUT
6: GP1/AN1/CIN-/Vref/ICSPCLK
7: GP0/AN0/CIN+/ICSPDAT
8: VSS
※MCLR# 外部リセット
※Vpp, ICSPCLK, ICSPDAT プログラム用
※CIN-, CIN+ コンパレータ用アナログ入力
_◇電源電圧、動作温度範囲、動作速度
①VDD上限 5.5V
②速度
VDD 4.5V以上 max 20MHz
VDD 3.0V以上 max 10MHz
VDD 2.0V以上 max 4MHz
③動作温度範囲
-40~85℃
ただし、A/Dは-40~0℃では2.5V以上。0~85℃では2.2Vと以上で使う。
_◇コンフィギュレーションビット
13,12: BGx 工場使用
11~9: (n/a)
8: CPD# データEEPROMコードプロテクト
7: CP# プログラムメモリコードプロテクト
6: BODEN ブラウンアウトリセット使用
5: MCLRE 外部リセットMCLR#使用
4: PWRTE# パワーアップタイマ使用
3: WDTE ウオッチドックタイマ使用
2~0: FOSCx
000 LP 発振子 5~37kHz
001 XT 発振子 0.1~4MHz
010 HS 発振子 1~20MHz
011 EC 発振器 0~20MHz
100 INTIO 内蔵RC、約4MHz
101 INTCLK 内蔵RC、約4MHz、外部出力
110 RCIO 外部RC、0~4MHz
111 RCCLK 外部RC、0~4MHz、外部出力
※内部発振器のキャリブレーション
OSCCAL = _READ_OSCCAL_DATA();
_◇割り込み
①タイマ0オーバーフロー
②INTピン入力エッジ
③GPIOポート入力レベル変化
④タイマ1オーバーフロー
⑤コンパレータ出力変化
⑥A/D変換終了
⑦データEEPROM書き込み終了
※GIEビット (INTCONレジスタ)割り込み全体のイネーブル
※割込みイネーブルビット、要因によりINTCONおよびPIE1レジスタに割付。
※割り込みフラグ。割り込みが発生すると1になる。クリアはソフトウエアによる。要因によりINTCONおよびPIR1レジスタに割付られている。(割り込みイネーブルになっていなくとも、割り込みフラグは立つ)
◆PIC16F690
◆HI-TECH PICC Lite
_◇データ型
①charのデフォルトはunsigned char
signed char宣言
②intは16ビット
_◇データメモリバンク
データメモリのバンク0~3のそれぞれに変数を作るために
bank1などのキーワードがある。
例)
bank1 int a;
_◇volatile
volatile宣言により、変数は最適化されなくなる。
例)
volatile int a;
_◇persistent
persistent宣言された変数は、PICがリセットされても内容は0にされなくなる。
例)
persistent int a;
_◇ポインタのサイズ
RWできるメモリへのポインタは8ビット。ただし、const宣言した定数はプログラムメモリを扱うために16ビット
_◇アセンブラとのI/F
①アセンブラで変数を使うには、変数をグローバル変数とし、グローバル変数名の名の前にアンダーラインをつけることでアセンブラ内でも参照できる。
例)
unsigned char a;
main()
{
a=1;
#asm
movlw 0x02
movwf _a
#endasm
}
_◇制限
①再帰呼び出しは使えない。
②割り込み関数と、割込み関数以外の関数からは、同じ関数を呼べない。
_◇マクロ
①__CONFIG(4桁の16進数)
コンフィギュレーションビット設定マクロ
_CONFIG(UNPROTECT & BORDIS & MCLRDIS & PWERTDIS & IESODIS & FCMDIS & WDTDIS & INTIO);
②__IDLOC(4桁の16進数)
IDロケーション設定マクロ
_◇機種ヘッダ
個別機種名をdefineしておいて、pic.hをインクルードすると適切なヘッダがインクルードされる。
例)
#define _16F690 1
#define
_◇割り込み
例)
interrupt func()
{
}
_◇Sampleコード
①bit型変数
main()
{
struct byte_s {
unsigned bit0:1;
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
};
union byte_u {
struct byte_s bits;
unsigned char byte;
};
union byte_u out;
out.byte=0xAA;
out.bits.bit0=1;
}
②ポート書き込み
void wait(int);
main(void)
{
int i;
PORTC=0;
TRISC=0xf0;
while(1) {
PORTC=0x01;
wait(20000);
PORTC=0x03;
wait(20000);
PORTC=0x07;
wait(20000);
PORTC=0x0f;
wait(20000);
}
}
void wait(int arg)
{
int i,j;
for (i=0; i<arg; i++) { j=i+3; j–; } }
◎Renesas
◆H8
汎用M16Cに対してASSPを標榜。
自動車(エアバッグ、ダッシュボード)、PC(エンベディッドコントローラ)、OA
◆H8/300
実行ステート(基本命令):2
バス幅:8bit
命令数:57 / 8アドレシングモード
アドレス:64KB
◆H8/300H
実行ステート(基本命令):2
バス幅:16bit
命令数:62
>転送演算命令追加
>乗除算命令追加
アドレス:16MB
◆H8S
実行ステート(基本命令):1
バス幅:16bit
命令数:65(/2000) 69(/2600)
/2000シリーズ
>ビット操作、シフト強化
>複数レジスタ退避
/2600シリーズ
>積和演算命令
アドレス:16MB
◆H8SX
実行ステート(基本命令):1
バス幅:32bit
命令数:87 / 11アドレシングモード
>メモリ演算
>アドレシング強化
>ビット操作強化
>短縮系
>データバス拡張
アドレス:4GB
◆R8C Tiny
◆R8C/2A, 2B, 2C, 2Dグループ
64/80ピン
フラッシュ48KB~96KB
RAM2.5KB~7KB
◆R8C/24,25グループ
52ピン
フラッシュ16KB~64KB
RAM1KB~3KB
◆R8C/18~1Bグループ
20ピン
フラッシュ4KB~16KB
RAM384B~1KB
◆RXファミリ
CISC可変長命令、3オペランド
5段パイプライン、ハーバード
1.65MIPS/MHz, 積和、単精度浮動小数点搭載
0.03mA/MHz(コア)
_◇RX600
_◇RX200
◆周辺
_◇RSPI
ルネサスのSPI
◆旧NECエレ(ルネサス)
◆78K
_◇78KOS/KA1+
20ピンSSOP, 1.2mm厚、0.65mmピッチ
_◇uPD789863
LF検波125KHz/4Kbps、オペアンプ、A/D、E2PROM、電圧レギュレータ、RC発振
_◇uPD789864
LF検波125KHz/4Kbps、オペアンプ、A/D、E2PROM、電圧レギュレータ、セラミック発振
◎Toshiba
◎Oki
◎Cypress
◆PSoC
CapSense
http://www.cypress.com/touch
◎EPSON
◆S1C63 Family
4ビットマイクロコントローラ
_◇アーキテクチャ
PUSHで複数ニブルをメモリに置く場合、下位の番地に高いニブルが置かれる。
LDBで複数ニブルをBAにロードする場合、下位の番地がロウニブルのA,
上位の番地がハイニブルのBである。
_◇レジスタセット
PC 16bit
X index register 16bit, XH, XLとして8ビットアクセス可能
Y index register 16bit, YH, YLとして8ビットアクセス可能
QUEUE
16ビット幅スタック操作中に使用される
SP1
16ビット幅スタック操作用ポインタ 8bitだが2ビット左にシフト
した位置にある
SP2
4ビット幅スタック操作用ポインタ
EXT
16ビット拡張時に使われる8ビットレジスタ
BA
8ビットのアキュムレータ, 通常はB(上位)、A(下位)単独で4ビットの
操作に使用する
F
フラグレジスタ
bit 0 Z
bit 1 C
bit 2 Interrupt
bit 3 Extension mode (EXTを使った拡張アドレシング示す)
_◇プログラムメモリ
13bit x 64Kワード、リニア空間
0000H
通常プログラム領域。ただし、CALZ命令のターゲットになるのでコモンルーチン等を配置するのに適する
00FFH
0100H NMI割り込みベクタ(Watch Dog)
0101H
ハードウエア割り込みベクタ
010FH
0110H プログラム開始アドレス
0111H
ソフトウエア割り込みベクタ
013FH
0140H
プログラム領域
FFFFH
_◇データメモリ
0000H
SP2スタック(4ビットスタック)領域
SP1スタック(16ビットスタック)領域の最下部
データ領域
00FFH
0100H
SP1スタック(16ビットスタック)領域の上位
データ領域
03FFH
0400H
データ領域
FEFFH
FF00H
メモリマップドI/O
FFFFH
_◇命令セット
CALZ imm8
プログラムメモリ0000H~00FFHをコール。各種コモンルーチンの呼び出し等に使える。
INT imm6
0100H(NMI)から013FHまでをターゲットにソフトウエア割り込み
_◇機種
※S1C6F666
※S1C63567
◆S1C8F626
_◇0FF02h
1 0
D3 OSC3 OSC1
D2 OSC3ON OSC3OFF
D1
D0 VD1=2.5V VD1=1.8V
□MicroProcessor
◎x86
◆Intel
◆Woodcrest SERVER Xeon5100Series Dual Core/64 bit
◆Conroe DESKTOP
◆Merom NOTE
◆Presler SERVER
◆Yonah NOTE – Core Duo
◆資料入手先
http://www.intel.com/products/processor/manuals/index.htm
http://www.intel.com/jp/download/index.htm#ia32
◆x86品種
_◇8086、8088
_◇80286
16ビット
プロテクトモードによる保護機構
1GB仮想空間、16MB物理空間
_◇80386
32ビット
リニアな4Gバイトメモリ空間
_◇80486
※5段パイプライン
①Fetch
②Decode1
③Decode2
④Execute
⑤Write-Back
※キャッシュ搭載
※FPU内蔵
※倍速クロックDX2、3倍速クロックDX4
⇒以降バスクロックと内部動作クロックは分離することが定着する
_◇Pentium
スーパスカラー(2命令)
⇒ただしパイプラインは同等ではないので、組合せによる
FPU強化
_◇MMX Pentium
SIMD演算(MMXとよぶ)対応
64ビット幅を2,4,8分割し、8,16,32ビット整数値を処理
このときはMMXレジスタはFPUレジスタと兼用
⇒浮動小数点レジスタとの混成ができない
_◇PentiumPro
P6
x86命令→μOPs変換
10段スーパーパイプライン
3並列スーパースカラー
レジスタリネーミング
アウトオブオーダー
分岐予想+投機実行
SMP対応キャッシュ同期機構
_◇PentiumII
PentiumProの16ビット命令処理が遅かったのを改善
PentiumProのL2キャッシュをオフメモリとして低価格化
⇒カートリッジ型の実装
MMX
_◇PentiumIII
L2キャッシュを内部に再とりこみ
1GHzを超える動作クロック
SSE(Streaming SIMD Extensions)追加
32bit単精度浮動小数x4並列(2クロック処理)
_◇Pentium4
NetBurstマイクロアーキテクチャ
20段パイプライン
L1キャッシュ(トレースキャッシュ)はμOPs保持
SSE2命令追加。倍精度浮動小数と整数に対応
ハイパースレッディングテクノロジ
⇒アーキテクチャ・ステートを2組持つ
※Prescott
31段パイプライン
SSE3命令追加(動画圧縮処理向け)
_◇PentiumD
Pentium4 コアx2のデュアルコア
⇒ハイパースレッディングは無効化
※Intel-64対応、64ビット化
_◇Intel Core
Coreマイクロアーキテクチャ
マルチコア指向
※Intel Core Duo
L2キャッシュを2コアで共用
※Intel VT(Vitualization Technology)
仮想化支援ハードウエア
_◇Intel Core 2
Intel 64
64 bit命令セット
16汎用レジスタ
※SSSE(Supplemental SSE)
※SSE4.1
MAD演算命令追加
_◇Intel Core i7
Nehalemマイクロアーキテクチャ
よりマルチコア、マルチスレッド向け
※SSE4.2
文字列検索、CRC計算など
_◇Xeon
64ビット化されたx86
※Xeon 5400番台
Coreマイクロアーキテクチャ
※Xeon5500番台
Nehalemコア
W5580 3.20GHz 130W, 4コア 8ML2, 25.6GB/s(QPI)
1333MHzメモリ +0.400G Turbo Boost, HT
E5502 1.86GHz 89W, 2コア 4ML2, 19.2GB/s(QPI)
800MHzメモリ, TB-HT無し
_◇Atom
動作温度拡大版 -40-85℃
Z520PT 1.3GHz
Z510PT 1.1GHz
437pinFCBGA
◆コア
Pentium II
131mm^2
Pentium III
0.25um 5LM CMOS Katmai 10.17×12.1mm 650MHz 950万Tr SSE
NetBurst 長大なパイプラインで周波数UPを狙った
180nm Willamette 20段
90nm Prescott 31段
65nm Cedar Mill 31段
Pentium M系 Pentium IIIの実行ユニット継承,Pentium4のバスI/F
130nm Banias (2003春)
90nm Dothan L2容量拡大
65nm Yonah デュアルコア、共有L2 -> 商標Core
Core2系
65nm Merom
65nm Conroe
45nm Penryn
Core i7 2008末
Core 2 Duo
Core 2 Quad
新
45nm Nehalem
コア最大8
QuickPath Interconnect (QPI)
メモリコントローラ集積
32nm Westmere
CPUとグラフィクスLSIは別チップワンパッケージ
32nm Sandy Bridge
CPUとグラフィクスはリング型インターコネクトでキャッシュ共有
開発コード ブランド 発表時期
◆技術名称
Wide Dynamic Execution
Micro Fusion
Macro Fusion
Smart Memory Access
Memory Disambiguation
_◇MMX(MultiMedia eXtension)
Pentium、Pentium IIに採用された拡張命令セット。整数演算の高速化を得意とするが、3Dグラフィックスの描画など浮動小数演算に弱い。
_◇SSE(Streaming SIMD Extensions)
Pentium III以降に搭載されているマルチメディア拡張命令セット。(KNIとも呼ばれていた)複数の浮動小数点数演算を同時に実行でき、マルチメディア処理向け命令が追加され、3Dグラフィックスの描画などにも向く
_◇FSB
パソコン内部で、RAMや拡張スロットなどとCPUを接続するデータ伝走路。また、その動作周波数。(マザーボードの)ベースクロックと同義。CPUの動作周波数は、FSBの動作周波数に整数または半整数をかけたものになる。
_◇PAE
Physical Address Extension
物理アドレス拡張
32ビットOSで4GBを超えるメモリを利用するための機構
◆IA-32 レジスタ構成
_◇基本レジスタ
32x8汎用レジスタ
┌──────┐
│ │
├──────┤
│ │
├──────┤
│ │
├──────┤
│ │
├──────┤
│ │
├──────┤
│ │
├──────┤
│ │
├──────┤
│ │
└──────┘
16x6セグメントレジスタ
┌──┐
│ │
├──┤
│ │
├──┤
│ │
├──┤
│ │
├──┤
│ │
├──┤
│ │
└──┘
EFLAGS
┌──────┐
│ │
└──────┘
EIP
┌──────┐
│ │
└──────┘
_◇フラグ
ZF ゼロフラグ
SF サインフラグ(演算結果が負ならセット)
CF キャリーフラグ
OF オーバフロー(符号付き演算での桁あふれでセット)
_◇FPUレジスタ
80x8浮動小数点データレジスタ
┌──────────────────┐
│ │
├──────────────────┤
│ │
├──────────────────┤
│ │
├──────────────────┤
│ │
├──────────────────┤
│ │
├──────────────────┤
│ │
├──────────────────┤
│ │
├──────────────────┤
│ │
└──────────────────┘
16ビット浮動小数点コントロールレジスタ
┌──┐
│ │
└──┘
16ビット浮動小数点ステータスレジスタ
┌──┐
│ │
└──┘
16ビット浮動小数点タグレジスタ
┌──┐
│ │
└──┘
11ビット浮動小数点オペコードレジスタ
┌─┐
│ │
└─┘
48ビットFPU命令ポインタレジスタ
┌──────────┐
│ │
└──────────┘
48ビットFPUオペランドポインタレジスタ
┌──────────┐
│ │
└──────────┘
_◇MMXレジスタ
64ビットMMXテクノロジレジスタ
┌──────────────┐
│ │
├──────────────┤
│ │
├──────────────┤
│ │
├──────────────┤
│ │
├──────────────┤
│ │
├──────────────┤
│ │
├──────────────┤
│ │
├──────────────┤
│ │
└──────────────┘
_◇SSE、SSE2レジスタ
128ビットXMMレジスタ(SSE/SSE2)
┌──────────────────────────────┐
│ │
├──────────────────────────────┤
│ │
├──────────────────────────────┤
│ │
├──────────────────────────────┤
│ │
├──────────────────────────────┤
│ │
├──────────────────────────────┤
│ │
├──────────────────────────────┤
│ │
├──────────────────────────────┤
│ │
└──────────────────────────────┘
32ビットMXCSRレジスタ
┌───────┐
│ │
└───────┘
◆IA-32 基本命令セット
_◇条件分岐
Jxx
E イコール
Z ゼロ
N ノット(NEのように組み合わせる)
G グレーターザン(符号あり)
L レスザン(符号あり)
A アバブ(符号なし)
B ビロー(符号なし)
_◇ストリング操作
※xにデータサイズ(B, W, D)が入る
MOVSx
CMPSx
※リーピートプリフィックス
REP ECXがゼロになるまでECXをデクリメントしながら繰り返す
REPE CMPSxでECXが0になるか、ゼロフラグが0(不一致)になるまで繰り返す
PEPNE CMPSxでECXが0になるか、ゼロフラグが1(一致)になるまで繰り返す
◆AMD
◆技術名称
3DNow!
◆品種
_◇Opeteron
_◇Athlon64
◆Technical Info
◆割り込み
割り込みベクタ番号 0~255
※0-31 予約領域
0 除算エラー フォルト
1 (予約済, Intel使用, フォルト、トラップ)
2 NMI 割り込み
3 BP トラップ (INT3)
4 Overflow トラップ(INTO)
5 BOUND フォルト(BOUND)
6 無効Opcode フォルト(UD2,予約Opcode)
7 Cp不在 フォルト(Copro命令)
8 Double アボート
9 CpSegOverRunフォルト(Copro命令)
10 InvTSS フォルト(タスクスイッチ、TSS)
11 Seg不在 フォルト
12 SSフォルト フォルト
13 GPフォルト フォルト
14 PGフォルト フォルト
15 (予約済)
16 x87 フォルト(Copro命令)
17 アラメント フォルト
18 マシンCHK アボート(モデル依存)
19 SIMD例外 フォルト(SSE,SSE2,SSE3)
20-31 (予約済)
※32-255 ソフトウエアで設定可能
_◇IDT Interrupt Descriptor Table
_◇レガシー割り込みコントローラ
PIC: Programmable Interrupt Controller
8259A, legacy PIC/XT-PIC
IRQ8本
割り込みを受け付けるとINTRピンをアサートし、割り込みベクタ番号(IRQ番号とは異なる)をCPUに伝える
※8259Aのつながる先は特定のCPUのINTR端子である
ATシステムの場合
マスタ8259A
IRQ0 システムタイマ
IRQ1 PS/2 キーボード(8042)
IRQ2 <- スレーブINT
IRQ3 COM2
IRQ4 COM1
IRQ5 LPT2
IRQ6 FDD
IRQ7 LPT1
スレーブ8259A
IRQ0 RTC
IRQ1
IRQ2 <- スレーブINT
IRQ3
IRQ4 PS/2 マウス
IRQ5 8087
IRQ6 プライマリIDE
IRQ7 セカンダリIDE
※PCIデバイスではIRQ番号は変動する
※Linuxでは /proc/interrupts で確認できる
※通常のPC上での8259AのI/Oポート
マスタ 0x20, 0x21
スレーブ 0xA0, 0xA1
初期化は以下の順にポートへ連続して書き込むことで行われる0x20 ICW1
0x21 ICW2
0x21 ICW3
0x21 ICW4
通常のアクセス
0x20,0xA0 リード
Interrupt Request Register, Interrupt Service Register
0x20,0xA0 ライト
割り込みコマンド
0x21,0xA1 リード
割り込みマスク
0x21,0xA1 ライト
割り込みコマンド
EOI発行は以下の手順による
0x21 ダミーリード
0x21 割り込みマスク
0x20 EOI発行
スレーブに対しては、カスケードされているので、スレーブ8259AにEOIした後、マスタにもEOI発行必要
_◇APIC
Advanced Programmable Interrupt Controller
プロセッサ毎にひとつある
Local APIC
周辺装置の割り込みを取りまとめる
I/O APIC
(I/O APICも複数実装できる)
※I/O APIC
1台で24個のGlobal System Interruptsを扱える
各プロセッサのLocal APICへ割り込みメッセージとして伝える。負荷の軽いCPUに送信するのが基本だが、割り込みのブロードキャストも可能
※RTE
Redirection Table Entry
最初のエントリ:Global System Interrupt base
その他のエントリ:Global System Interrupts
GSI – ベクタ番号 – IRQの割付はOSによる
※I/O APIC 。。。メモリ・マップド
複数のプロセッサからアクセスできる必要がある。
(volatileアクセス必須)
※IOREGSEL R/W
FEC0xy00h
x=0-Fh
y=0,4,8,Ch
操作するレジスタを選択するレジスタ
※IOWIN R/W
FEC0xy10h
x=0-Fh
y=0,4,8,Ch
操作対象となるレジスタへのウインドウとなる
メモリマップドレジスタのアドレスは、BIOS ACPI(Advanced Configuratin and Power Interface)のAML(ACPI Machine Language)から得られる
◆Windows解析用情報
◆Windows環境
_◇API関数
Kernel32.dll, USER32.dllなどの中にある関数
Win32API
戻り値は基本的にEAX,成功は数値1(非0)
文字列の解釈方法識別のために末尾に
A ANSI
W UNICODE
引数は、下の引数からスタックに積む
最後に第一引数が積まれる。
※親ウインドウを識別するハンドル
API関数のほとんどは、関数内で引数分のバイト数をスタックより破棄するので後処理の必要ない。(引数が不定というようなAPIでは呼び出し側で処理の必要あるものがある。)
_◇メッセージ
OSからアプリに送られる状況の変化を知らせるもの。ボタンなどは識別番号(ID)で知らされる。
GetMessage関数でMSG構造体をうけとり、DispatchMessage関数によりウインドウ作成時に指定しておいた処理プロシージャが動作する。
ウインドウプロシージャの先頭アドレス指定
RegisterClass関数
RegisterClassEx関数
CreateDialogParam関数
自分で処理する必要のないメッセージをシステムに処理させる場合
DefWindowsProc関数
OSでなく、自分でメッセージを送る
SendMessage関数
PostMessage関数
※Windowsメッセージ例
WM_COMMAND 0x0111 ユーザがメニューやボタン選択
WM_KEYDOWN 0x0100 非システムキーが押された
WM_MOUSEMOVE 0x0200 マウス移動
_◇ネイティブAPI
WindowsNT系OSが内部で使用する仕様が非公開のものが多く、互換性の問題が生じる可能性のあるAPI
役割に応じてNt,Zw,Rtlなどの接頭詞がつく。ntdll.dllに格納されている関数が多い。
※ネイティブAPI例
NtQueryInformationProcess
_◇実行形式ファイル (PEファイル)
EXE DLL OCX SCRなど拡張子は異なるが構造はほとんど同じ。
PE = Portable Executable
①PEファイルヘッダ
MZスタブ
オフセット0x3CからのDWordがPEのシグネチャへのオフセットとなる
PE COFFファイルヘッダ
WORD Machine 0x14Cなら386
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSYmblols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
オプションヘッダ
Windows上で実行される上での基本情報
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
プログラムコードセクションの合計サイズ
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint
イメージベース相対アドレス
DWORD BaseOfCode
コード先頭のイメージベース相対
DWORD BaseOfData
DWORD ImageBase
望ましい先頭アドレス
EXE 基本的に0x400000
DLL 基本的に0x10000000
DWORD SectionAlignment
DWORD FileAlignment
WORD MajorOperatingSystemVersion
WORD MinorOperatingSystemVersion
WORD MajorImageVersion
WORD MinorImageVersion
WORD MajorSubsystemVersion
WORD MinorSubsystemVersion
DWORD Win32VersionValue
DWORD SizeOfImage
DWORD SizeOfHeaders
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY配列
DWORDの仮想アドレスとDWORDのサイズの対
16エントリ
Export,Import Table, IATなどを指す
セクションテーブル
各セクションの構造を示す情報
※イメージベースを基準として相対値で表されるアドレスを
RVA(相対仮想アドレス)とよぶ
②プログラムコード
.text
③API関数呼び出し用の情報
.idata
④変数や文字列などのデータ
.data
⑤アイコンなどのリソース
.rsrc
_◇IAT (Import Address Table)
プログラムで使用するAPI関数のプログラムコード開始位置のアドレスを格納したテーブル。Windowsがプロセスを生成するときに、メモリ空間上のDLLファイルが読み込まれたアドレスをベースに実際のアドレスで書き換える。
実行可能ファイルのIATは、開始アドレスではなく、アドレスを探すための情報が格納されている。
動作例)
コードセクション内で
CALL DWORD PTR[40508C]
インポートセクション内のIAT 40508C番地
関数アドレスが格納されている
_◇DLL (Dynamic Link Library)
拡張子は必ずしもDLLとは限らない。
Loadlibrary関数
メモリに読み込んで読み込み先アドレスを得る
GetModuleAddress関数
既に読み込まれているアドレスを得る
GetProcAddress関数
DLL内のAPI関数のアドレスを得る。
※WindowsXP, Windows Vista
ntdll.dll, Kernel32.dll, USER32.dll
どのプロセスでもアドレスは同一。
他のDLLは一定せず。
基本的に高いアドレスに読み込まれる
※主なコンパイラと使用DLLファイル
Visual C++/C++ .NET
MFCxx.DLL MSVCP60.DLL
Visual Basic
MSVBVMxx.DLL
Borland C++ Builder
VCLxx.BPL
_◇カーネルドライバ
デバイスドライバにかぎらず、カーネルモードで動作し、システムの各種情報にアクセスするもの
※32ビット版Windowsでは、デジタル署名の無いドライバも使用可能。Vistaでは、デジタル署名が無いカーネルドライバを使用すると、Blu-rayコンテンツなどを再生不可にするProtected Video Pathが実装されている。
※64ビット版ではデジタル署名必要
_◇プロセスとスレッド
プロセスはさらに「スレッド」という実行単位に細分化される。プログラム実行開始時に最初から実行されるスレッドはメインスレッドと呼ばれる。
レジスタはスレッド毎
それぞれのスタック用のメモリが割り当てられる
プロセスメモリは共有
※スレッド作成
CreateThread関数
CreateRemoteThread関数
※PEB Process Environment Block
プロセスの情報が構造体として格納されているブロック
たいてい0x7FFDF000周辺
(Windows2000, WindowsXP SP1では必ず)
※TEB Thread Environment Block
PEBの近くに置かれることが多い。
※プロセスメモリ
各プロセスには4GBの空間が割り当てられる。ページサイズは4KB単位。
ユーザーモードで使用可能なアドレス
0x10000
0x7FFEFFFF
カーネルモード領域
0x80000000以降
_◇資料入手先
http://www.microsoft.com/downloads/details.aspx?FamilyId=0BAF2B35-C656-4969-ACE8-E4C0C0716ADB&displaylang=en
http://msdn2.microsoft.com/en-us/library/default.sapx
http://msdn.microsoft.com/library/ja
http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx
◆デバッガ
_◇デバッガの種類、分類
※動作モードによる分類
①ユーザモードデバッガ
アプリケーション対象にし、ユーザモードで動作するが、他のプログラムを制御下における。
②カーネルモードデバッガ
OS中核部のプログラム、ドライバを対象にするデバッガ。
※他の分類
①シンボリックデバッガ
②アブソリュートデバッガ
③Just-In-Timeデバッガ
実行中のプログラムで致命的なエラーが発生したときに、あらかじめレジストリで指定しておいたデバッガを自動的に起動してデバッグを開始できる。WindowsOS機能。多くの統合開発環境付属デバッガが対応。
_◇代表的デバッガ
①OllyDbg フリーのユーザーモードデバッガ
②SoftICE カーネルモードデバッガ。販売終了。
③Debugging Tools For Windows MSのデバッグツール
カーネルモードデバッガ KD
ユーザモードデバッガ CDB, NTSD
④IDA Pro 逆アセンブラとしての機能強力。商用ツール。
⑤WKTVBDebugger VB用のデバッガ
⑥PEBrowse Professional Interactive .NET Framework用
_◇WindowsXPまでの制限
いったん制御下においたアプリケーションの制御をデバッガの終了時にWindowsに戻すことはできない。デバッガを終了すればアタッチされていたアプリケーションも必ず強制終了される。
_◇主要機能
①ブレークポイント設定
②ステップ実行
③ステップオーバ、ステップイン、ステップアウト
ステップイン プロシージャにステップして入る
ステップアウト プロシージャから外に出るまで自動
ステップオーバ プロシージャを自動実行
④メモリ内容の確認、書き換え
⑤OSからの情報通知
_◇OllyDbg
32ビットx86の32ビットWindows上の、C/C++ネイティブコードを対象とするデバッガ
http://www.ollydbg.de/
http://hp.vector.co.jp/authors/VA028184/
◆他のツール
_◇プロセスメモリエディタ。
うさみみハリケーン
http://hp.vector.co.jp/authors/VA028184/
_◇逆アセンブラ
PeRdr
http://sourceforge.net/projects/perdr
_◇プロセスモニタリングツール
http://www.microsoft.com/technet/sysinternals/
_◇リソースエディタ
Resource Hacker
http://www.angusj.com/resourcehacker/
_◇仮想マシン構築
※フリーの仮想マシン構築 VirtualBox
http://www.virtualbox.org/
※VMwareの無償版 VMware Player
http://www.vmware.com/download/player
仮想マシン構築にはQEMUが必要
_◇ファイルアナライザ
PEiD パッカー、コンパイラ等を判別
http://peid.has.it/
_◇モジュール依存関係の解析ツール
Dependency Walker
http://www.dependencywalker.com/
_◇.NET Framework対応アプリケーション用逆コンパイラ
Reflector for .NET
http://www.aisto.com/roeder/dotnet/
◎i860
◎PowerPC
AntiVec
◎ARM
◆Cortex
_◇Cortex-M0
最小構成のCortex
180nm ULLプロセスで12000G, 85uW/MHz
ARMv6-M, 0.9DMIPS/MHz
_◇Cortex-M3
33000-60000G
◎RISC-V
◎VLIW
◆IA-64
_◇Itanium
_◇ItaniumII
□GPU
◆歴史
PC用グラフィックアクセレータ。。。2D描画
3D処理の最初。。。SGIのジオメトリエンジン
⇒OpenGLへ
1994
ソニープレイステーション。。。家庭用ゲーム機にジオメトリエンジン搭載
1996
マイクロソフト…Direct3D(1995発表のDirectXに3Dを追加)
1999
DirectX 7.0 チップでTransform&Lightingを担当できるようになる
⇒座標変換、光源演算(ハードウエアT&L)
⇒NVIDIA GeForce 256 最初のGPU
⇒演算はまだ固定
DirectX 8.0 プログラマブルシェーダ
⇒計算式をプログラム可能となる
◆GPU処理フロー
①Vertex 座標計算(頂点座標)
②Triangle 三角形として位置計算
③Pixel 平面の陰影処理、テクスチャ処理
④ROP Zバッファ処理、ラスタライズ
⑤Memory フレームバッファ出力
ROP=Rendering Output Pipeline
_◇シェーダ
①Vertex Shader
座標変換、頂点単位の光源計算
②Pixcel Shader
ピクセル単位の処理。テクスチャマッピングなど
※シェーダのプログラミング
当初、GPU固有のアセンブリ言語
⇒NVIDIA Cg
⇒Microsoft HLSL(High Level Shader Language)
⇒OpenGL GLSL(OpenGL Shading Language)
③統合型シェーダ
ユニファイドシェーダ
ヴァーテックスシェーダとピクセルシェーダを統合したもの
⇒状況に応じて演算ユニットの用途を振り分け
_◇GPGPU
General Purpose computing on GPU
⇒GPUでの処理が普通になってから⇒GPUコンピューティング
◆品種
_◇GeForce 8800 GTX
SP: スカラー型の計算ユニット 128
32ビット浮動小数点演算
8SPを単位として制御用のユニットを加えSM(Streaming Multiprocessor)
_◇Tesla(G80)
G80アーキテクチャ
演算専用(ビデオ出力のサポートなし)
6億8100万トランジスタ
128CUDAコア
128MAD演算/クロック
ワープスケジューラ(SM) 1
特殊関数ユニット(SFU) 2
共有メモリ/SM 16KB
SMキャッシュなし
ロードストアアドレス幅32ビット
※ワープスケジューラ
32本スレッドをグループとしてスケジューリング=ワープ
⇒メモリアクセスの単位でもある
※特殊関数ユニット
超越関数などの計算。1クロックで1スレッドに対して1演算
※共有メモリ
単独のSMないで共有されるメモリ
Tesla C1060
933GFLOPS, 4GBメモリ
Tesla S1070
⇒東工大TSUBAME
S1070=4プロセッサ構成 x 170台=680プロセッサ
理論的には約680TFLOPSだが実際は170TFLOPS
_◇GT200
14億トランジスタ
240CUDAコア
倍精度浮動小数点可能(30FMA/クロック)
240MAD演算/クロック
ワープスケジューラ(SM) 1
特殊関数ユニット(SFU) 2
共有メモリ/SM 16KB
SMキャッシュなし
ロードストアアドレス幅32ビット
※FMA
Fused Multiply-Add
MAD演算の積を求めたときに切り捨てられてしまう下の桁も保存しておき、和の計算も行う。
_◇Fermi
30億トランジスタ
512CUDAコア
倍精度浮動小数点可能(256FMA/クロック)
512MAD演算/クロック
ワープスケジューラ(SM) 2
特殊関数ユニット(SFU) 4
共有メモリ/SM 48KB/16KB
SMキャッシュ L1=16KB/48KB, L2=768KB
カーネルの同時実行サポート(最大16)
ロードストアアドレス幅64ビット
※カーネル
GPU内部で実行されるプログラム
◆開発環境
_◇CUDA
2006 NVIDIA
⇒GeForce8シリーズ以降対象
プログラム言語としてはCおよびC++のサブセット
_◇OpenCL
GPUベンダーに依存しない開発実行環境
NVIDIAも閑居しているので、CUDAとOpenCLは排他的ではない
_◇DX Compute
MicroSoftのGPU開発環境
□DSP
◎概要
◆オペランド
1積和演算2オペランド必須
⇒FIR演算など
複数のメモリブロックなどで擬似マルチポート化
複数バスでオペランド同時フェッチ
DOループ
◆アドレシング
_◇ビット・リバーサル
_◇サーキュラ
◆データフォーマット
_◇Qフォーマット
固定小数点フォーマット
2の補数表現、多くは16ビット幅、演算途中で32ビット幅も
2進仮想小数点以下のビット数nを用いて
Qnフォーマット
と称する
⇒Q15, Q14など
※基本、ソフトウエア管理、ハードで面倒みるものではない
⇒数値円
◎TI
◆C2000シリーズ
低価格、モータ制御向けDSP
⇒現状はマイコンという扱い
※モータに流れる電流を見て制御する電流制御が可能
⇒従来、モータ回転数をセンサで見る
◆C5000シリーズ
TMS320C5000 (C54x)
16ビット固定小数点、携帯電話向けだった
⇒低消費電力
◆C6000シリーズ
VLIWアーキテクチャ
固定小数点16ビットのシリーズ
浮動小数点32ビットのシリーズ
_◇マルチコア
_◇ARMとのヘテロ構成
◆ペリフェラル
_◇McBSP
□並列処理
◎Multithreaded Programming
◆Multithreaded Programmingの課題
1. Finding and creating concurrent tasks
2. Mapping tasks to threads
3. Defining and implementing synchronization protocols
4. Dealing with race conditions
5. Dealing with deadlocks
6. Dealing with memory model
7. Composing parallel tasks
8. Achieving scalability
9. Achieving portable & predictable performance
10. Recovering from errors
11. Dealing with all single thread issues
□ヘテロジニアス・マルチ
◎CELL
CELL Broadband Engine (CBE)
アーキテクチャ名としても実装されたプロセッサ名としても使われる。
PlayStation3のために開発された
◆概要
深いパイプラインの動作周波数優先?設計
_◇PPU (PowerPC Processor Unit)
1個/複数のPPUでPPE (PowerPC Processor Element)
_◇SPU (Synagitic Processor Unit)
1個/複数のSPUでSPE(Synagitic Processor Element)
_◇SPE
SPUとLS (Local Store)からなる
SPUがアクセスできるのはLSのみ
_◇LS
グローバルメモリ空間に固有のイメージアドレスを持つ
256Kバイト
幅広だが、シングルポート
MFC(Memory Flow Controller)、一種のDMACによりPPEから送り込む
_◇SPU:レジスタ
128 bit GPR * 128本
レジスタ上のデータは常にパック形式、演算はSIMDが基本
例)32ビットfloatなら4個、16ビットintなら8個
GPRをアドレス指定に使うときは下32ビット
128本あるので、レジスタ指定に7ビット必要
入力3、出力1をしていできる積和命令では7*4=28ビットをレジスタ指定に使い、かつ2形式の積和系命令があるので、積和命令だけで1/8のオペコードスペースを使用している。
_◇SPU:パイプライン
命令実行パイプラインは2本(2スロットのVLIW的)
even 演算用
odd 制御用
レジスタの依存関係でインターロックかかる
インオーダ実行
_◇SPU:命令セット
⇒ビッドフィールド命令なし=データ圧縮伸張には向かない
⇒OSの実行などにも不向き
⇒演算シーケンサ的
分岐
⇒0ディレイループなどはない
⇒分岐ヒント(ソフトウエアによる)あり
ヒントが当たれば1サイクル
ヒントが外れると18-19サイクル
プレディケーション命令
⇒短い if 文の代わりに両方を計算しておいて、後から条件で1方を選択
ロード命令にレイテンシあり
⇒アンローリングで回避
_◇SPU:メモリアクセス
命令フェッチは1サイクルで128バイト!
MFCアクセスも1サイクルで128バイト!
GPR<>LS転送は1クロック?(レイテンシあり)
⇒レジスタ大でハードによるスーパスカラ的巧妙な制御なし
⇒ループアンローリングとインタリーブ最適化
シングルポートだが幅が広い
複雑なアドレシングなし
ポスト・インクリメント
ビット・リバーサル
サーキュラ
_◇浮動小数点演算
非正規化数のサポートなし
丸めモードは0への切捨てのみ
偶数への丸め←一般的、統計的カタヨリは四捨五入より小
+∞方向切り上げ
-∞方向切りすて
◆PS3搭載のCBE
1 PPU + 8 SPE (1SPE=1SPU)
◆ソフトウエア
SPUのプログラムはPPUのプログラムとはリンクされる、実行時にPPUによりSPEにダウンロードされる
⇒PPUからみてSPUは演算ペリフェラルに見える
□プロセッサ横断比較
◎性能評価、プロファイリング向け機能
◆クロック読み出し命令
_◇Pentium
※rdtsc
EDX:EAXに64ビット読み出される
unsigned long long clockcount_amd64(void)
{
unsigned int eax, edx;
__asm__ volatile (“rdtsc” : “=a” (eax), “=d” (edx));
return eax | (unsigned long long)edx << 32;
}
⇒AMD64でもIA32でも使用可能。
_◇Itanium
※mov R = ar44
Rに64ビット格納
_◇PowerPC
※32bit PowerPC
mftbu H
mftb L
Hに上位32ビット、Lに回32ビット
2命令必要なため、上位、下位、上位と2回上位をよんで、上位32ビットが変化していなかったら採用する
※64bit PowerPC
mftb R
Rに64ビット格納
_◇UltraSPARC
rd %tick, R
Rに64ビット格納
_◇PA-RISC
mfctl Tcr16, R
PA-RISC1.0 ではRに32ビット、PA-RISC2.0ではRに64ビット
_◇Alpha
rpcc R
Rの下位32ビットに32ビット格納
上位にはOS依存の値
_◇IBM S/390
stck ADDRESS
指定したアドレスから8バイトに格納
_◇MIPS
mfc0 R, $9
32ビット
_◇SH64
getcon cr62, R