EXEファイルのセクション

セクションにはデータサイズ、RVAなどが保存される
L ネイティブコード、リソース情報、デバッグ情報など
L 読み込み専用領域、再配置情報、インポート関数、エクスポート関数など

なるほど、ソースコードだけでなく、ソフトウェア一式ってイメージだな

typedef struct _IMAGE_SECTION_HEADER {
	BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
	union {
		DWORD PhysicalAddress:
		DWORD VirtualSize;
	}
	DWORD VirtualAddress; // セクションサイズ
	DWORD SizeOfRawData; // セクション位置
	DWORD PointerToRawData;
	DWORD PointerToRelocations; //再配置エントリ情報
	DWORD PointerToLinenumbers; //行番号
	WORD NumberOfRelocations; //再配置エントリ
	WORD NumberOfLinenumbers;
	DWORD Characteristics; // セクション特性
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADERS;

Nameはセクション名
.text, .data, .idata, .edata, .rsrc, .debug, .reloc, .tls

.text, .data, .rsrcなどの各セクションはIMAGE_SECTION_HEADER構造体の後に配置。やっとか。

インポートは外部DLLと動作リンクを行う
リソースセクション(.rsrc)では、実行に直接関係ない特徴的なデータを管理
 L データ型、ID、言語

結構気の遠くなるようなことやってるなー
あれ、でもメモリのポインタってC言語だとソースの中で指定するはずだけど、PointerToRawDataでIMAGE_SECTION_HEADER構造体で指定している?
それと、ネイティブコードのセクションは構造化されるのだろうか?それとも、1つのセクションに纏められるのだろうか?データ処理で考えると、.textセクション、.dataセクション、.rsrcセクションなど各セクション内部で構造化された方が効率的に見えるが。。
ああああ、メモリかー

EXEファイルのPEヘッダ

IMAGE_NT_HEADERS32に定義

typedef struct _IMAGE_NT_HEADERS {
	DWORD Signature;
	IMAGE_FILE_HEADER FileHeader;
	IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADER32, *PIMAGE_NT_HEADERS32;

PE headerにもSignature
4byte? 32bitOSを意志的している

IMAGE_FILE_HEADER構造体

typedef struct _IMAGE_FILE_HEADERS {
	WORD Machine;
	WORD NumberOfSections;
	DWORD TimeDataStamp;
	DWORD PointerToSymbols;
	DWORD NumberOfSymbols;
	WORD SizeOfOptionalHeader;
	WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_NT_HEADERS;

Machineはそれぞれフラグがあう
unknown:0x0 あらゆるマシンタイプ
I386:0x14c Intel386以降
R3000: 0x162
R4000: 0x166 MIPS(r)リトルエンディアン
R10000: 0x168
….

NumberOfSections: 保持するセクション数
TimeDataStamp: 作成された日時
PointerToSymbols, NumberOfSymbols:シンボルテーブルの位置、数
SizeOfOptionalHeader: 構造体サイズ保持
Characteristics:ファイズ属性値
 IMAGE_FILE_EXECUTABLE: 0x0002
IMAGE_FILE_LINE_NUMS_STRIPPED: 0x0004

IMAGE_OPTIONAL_HEADER32構造体も同様に定義される
 Magic,MajorLinkerVersion, SizeOfCode, SizeOfInitializedData,
SizeOfInitializedData, SizeOfUnitializedData,AddressOfEntryPoint, BaseifCode, BaseOfData, ImageBase, …

IMAGE_DATA_DIRECTORY構造体はRVA, Size

PE Headerにはターゲットマシン、アライメント情報、セクション情報、メモリサイズ情報などが格納されており、OSがメモリにロードして実行する際に書き込まれる

OS側では書き込まれた内容を元にメモリで実行する
ツールを使用すればコンパイル時に自動生成される
第一印象項目が多いなと思ったが、exeファイルの共有フォーマットと考えると妥当か

EXEファイルの内部構造

Windowsの実行ファイルEXEファイルは、通常Visual C++, Visual Basic, Delphiなどのコンパイラが自動生成する
L ほとんどがデータサイズ、ファイル、メモリを指し示すオフセット値で構成されている

MS DOSはマイクロソフトが開発したパソコン用OS
sublimeで開くとバイナリコードでどのように書かれているかわかりません。
 L x86に対応する機械語。アセンブラではない。

MZシグネチャはEXEファイルを裏付けるデータ

EXEファイルが動くマシン
– Intel 386以降(Windows)
– MIPS(r)
– Alpha AXP(tm)
– Motorola 68000
– Power PC
– 日立SH3, SH4

リソース箇所にデータを格納する

PEヘッダ(Portable Executable)
EXEファイルの先頭部分の情報

EXEファイルのロード方法
MicrosoftのOSが、MZシグネチャ、マシンタイプ、ネイティブコードなどの情報をもとにEXEファイルをメモリ上にロードして実行する
1. シグネチャ、マシンタイプを確認
2. EXEイメージをメモリ上にコピー
3. PEヘッダ記載データを元にEXEイメージの初期化
4. PEヘッダで指定されたスタートポイントからプログラム実行
なるほど、ディスクに保存したexeファイルをメモリ上に読み込んで、1行ずつ処理していくのね。

EXEファイルイメージは実行前にプロセスメモリの任意の場所にロードされる。メモリの先頭位置をイメージベースという。
RVA(Relative Virtual Address)とはイメージベースからの相対オフセット値
ファイルポインタで読み込み対象となるデータ位置を指定し、RVAでプロセスメモリ上のデータを指し示す

イメージベース + RVA = データアドレス

EXEファイル先頭
IMAGE_DOS_HEADER …MS-DOSで認識可能なデータフォーマット
MS-DOS用スタブ …ネイティブコードを保存できるスペース
NULL空間 … PEヘッダの先頭位置は8バイト境界
PEヘッダ

なるほど、*.exeと*.pkgではソースコードは一緒だけど単純に拡張子だけ異なるって訳ではないのね。当たり前か。
EXEファイルがMS-DOS用のヘッダやデータフォーマットということは、一つのソフトでもOSが変われば当然、ファイルの中身が違うってことですな。

OSごとのインストールファイル

zipファイルなどのアーカイブファイルを展開した場合、アプリケーション管理ができない、インストール・アンインストールの設定が自動的にできない、などの制限があるため、インストーラがインストールする

Windows
1.exe形式のインストーラ
2.msi形式のインストーラ
 L リソース情報だけを持っており、インストールはWindows Installerで行う
 L Visual Studioを利用すれば、msiを利用したexe形式としてインストーラを作成できる

OS X
1.appファイル
2.dmg(ディスクイメージファイル)
3.pkg(パッケージファイル)
 L 動作に必要なパッケージも同時にインストール
 L パッケージ管理システム Homebrew

Ubuntu
1. apt
L debファイルからインストール

CentOS
1. rpm

OSごとにインストールファイルやその仕組みが異なることは分かった。
で、これ全部C言語で書いて、buildする必要あるの??

スパコン

スパコンは多数のノード(cpuとメモリ)をネットワークで繋げたもの
典型的なノードは数万ノード(京は8万)
※88128CPU(705024コア) 70万コアってことは1コア9スレッド?
パイプライン方式で処理を高速化
チューニングは作用反作用無視、条件分岐削除、相互作用粒子ソード、除算削除
OSはlinuxが多い
開発言語はFortran, C/C++

中国の「神威太湖之光」。1秒間に9.3京回の計算
中国はCPUも内製

現在の主な用途は、軍事、量子力学、天気予報、気象研究、計算化学、物理シミュレーションなどか。

GPU

ビデオカード、グラフィックカード、グラフィックボードと呼び方は多数
ビデオチップをGPUと呼ぶ。ビデオメモリもある

macだと、グラフィックスに、Intel Iris Plus Graphics 640 1536 MB と記載がある
これはCPU一体型のGPUなので、独立型より性能は劣る

GPU
グラフィック演算処理、並列演算処理(スーパースカラ)が得意
CPUが3〜5の並列処理のところ、GPUは512も
コア数もCPUよりGPUの方が多い、 eg.5120
消費電力が高い
500Mhz~650Mhzあれば綺麗な画像で楽しめる

VRAM(ビデオメモリ)
 映像データを一時的に保存
 RAMと同様、容量、速度が重要。128〜258MB, 1Ghz~1.8Ghzあれば十分
メモリバス幅は128〜256bit

ビデオカードスロットとバスには 1) AGP(転送速度が2.128GB/S)と 2) PCIエクスプレスX16(主流、4GB/S) の2タイプがある

ビデオカードには、DVI-I端子(デジタル・アナログ)、B-sub15ピンのVGA端子(アナログ)、DVI-D(デジタル)などの端子がある
TV出力端子(S端子)はテレビに表示

グラフィックボードのチップメーカーはNVIDIA、AMDなど
NVIDIAはよく聞きますね。あれ、AMDって、CPUだけでなく、GPUもやってるの?

MSI GeForce GTX 1660Ti Gaming X
MSI GeForce GTX 1060 GAMING X 6G
Nvidia GeForce RTX 2080 8GB GDDR6 – Founders Edition
 L VRAMの容量が大きいほど描画が綺麗になりやすい
 L GeForceはゲームを目的とすると、動作保証が取れているということ

Memory

Memoryとは?
 SSD・HDDから取り出したデータを処理する
e.g. 8 GB 2133 MHz LPDDR
 ん?CPUにもL1, L2, L3(SRAM)があるんだから、必要か?
DRAMもSRAMも電荷が必要
 
メモリチップ
 メモリー規格、容量、性能が詰まっている
 CL、動作クロック(周波数)の性能はメモリーチップによって決まる

接続端子
 m/bと接続。デスクトップは240pin、ノートは200pinが主流

SPD(Serial Presence Detect)
メモリーチップの種類、容量、動作周波数などの情報を記憶
BIOSのようなもの

スタブ抵抗
 データを高速でやり取りする際に発生する信号のノイズを制御

メモリチップ
 メモリセルにトランジスタとキャパシタが入っており、0の時に電荷がなく、1の時に電荷がある。
 記憶をコンデンサの電荷として蓄える。一定時間後、自然放電される

読み方
DDR2 Samsung 2GB 2Rx8 PC2-6400U-666-12-E3 2GB
DDR3L 1600 (PC3L-12800) 8GB CL11 1.35V Non-ECC SO-DIMM 204pin KVR16LS11/8
DDR4 Micron 64GB MTA36ASF2G72PZ-2G1A2IK(PC4-2133P ECC)

DDR(Double Data Rate)~はメモリチップ、クロック信号の立ち上がりと立ち下がりを両方利用
DDR X はDDRの世代 第四世代はDDR4 実働周波数にそれぞれ読み込む量をかけた数
PCはメモリモジュール
DDR2のメモリチップ、PC2のメモリモジュールで、6400は転送速度(1秒6400MB転送可) この数字が大きければ転送速度が早いという意味
2GBはメモリ容量、当然大きい方が良い
 CLはデータ読み書き開始までの待ち時間
 ECCはエラーの自動訂正機能

ぱっと見、DDRが高い方が、動作クロック、メモリモジュール、容量、転送速度などの性能も良さそうですね。

デュアルチャンネル、トリプルチャンネルはメモリをマルチで使用すること

メモリメーカー
I-O DATA, Buffalo, samsung, umax, cfd, a-dataなど

ubuntuでのメモリ確認方法
vagrant@trusty:~/other$ free -m
total used free shared buffers cached
Mem: 489 414 75 0 52 262
-/+ buffers/cache: 99 389
Swap: 0 0 0

HDDとSSDの違いは?

EBSは、SSD、HDDどちらもありますが、さて、タコができているかもしれませんが違いは。

HDD
HDDはHard Disk Driveの略で、電磁的に書き込み・読み込みする
プラッタと呼ばれる磁性体に塗られた円盤が入っており、ヘッドで書き込み、読み込みする
プラッタの回転数が多いほど、短時間で大量データ処理が可能
回転数はrpmという単位で表示される、1分間のプラッタ回転数(1分間に約7200~15000回転)
磁気ヘッド先端の電磁石がディスク表面のブロックの磁気方向を変えてデータを書き込む。書き込まれたデータは磁気リーダで読みこむ。読み込みはレコードの仕組みに似ている
電波ノイズを軽減する数値計算用アルゴリズムを改良している
保存できるデータ量が大きく、容量単価が安価だが、衝撃に弱く消費電力が大きい
機械駆動式のため、徐々に壊れる
トラックまでヘッドを移動させる「シーク時間」とセクターが来るまで待つ「回転待ち」時間を要する
SEAGATE, Toshiba, Western Digital
レーザーを使ってディスク表面にピンポイントで熱を与えてデータを書き込むheat assisted magnetic recording、HAMRが開発中。Bit Pattern Mediaが実用化すれば20TビットのHDDなども

SSD
Solid State Driveで半導体素子メモリを使ったドライブ
メモリーチップ内蔵。メモリチップはデータを記憶するICチップ
SSDの構造は、コントローラとNAND型フラッシュメモリ
衝撃に強く、発熱、消費電力が少ない、読み書きの速度が早く作動音がない。
HDDより小さく、軽い。ただし容量が少なく、容量単価の価格が高い
フラッシュメモリのセルも徐々に劣化する。1千~1万回で劣化
CFD、Samsung, Silicon-Power, Transcend
真性半導体、P型半導体、N型半導体に変化し、シリコンウエハーの表面に電子回路パターンを多層形成する
電子回路パターンはNAND型:否定論理積、NOR型:否定論理和
セル内部のフローティングゲートで電子を貯めているため、電源を切っても記憶できる
セルは、絶縁膜、フローティングゲート、トンネル酸化膜、シリコン基盤
SSDコントローラがNAND FLASHを制御
ウェアレベリング処理で、セルの負担を軽減 エラー補正機能やブロックの消去回数なども管理している
SSDは数百メガバイト/秒の転送速度で、HDDの50〜150MB/Sを大きく上回る NANDフラッシュメモリを平行動作

デュアルストレージ
SSDとHDDを両方搭載
SSDにはOSを入れ、HDDにはソフトやデータ保存を行う
e.g. M.2 SSD 256GB Serial ATAIII M.2規格+1TB Serial ATAII 5400rpm

ヨドバシカメラなどをいくと、windowsのノートはデュアルストレージがかなり売られていた。SSD256GB + HDD1T or 2TBが多い。
OSXはSSDだけども、デュアルになってくのだろうか。。

EC2のCPUはインテル? AMD?

EC2ってiシリーズ使ってるの?
AMDのEPYCを使っているらしい。x86-64マイクロプロセッサ
EPYCのシリーズをみるとL1, L2, L3をみると、L3が拡大化してるな。
—-
Amazon Elastic Compute Cloud (Amazon EC2) は、安全でサイズ変更可能なコンピューティング性能をクラウド内で提供するウェブサービスです。開発者がウェブスケールのクラウドコンピューティングを簡単に利用できるように設計されています。 AWS は、AMD とのパートナーシップを通じて、最も広くかつ深いインスタンスポートフォリオを強化する追加的な EC2 インスタンスを提供し、ワークロード要件に対するコストとパフォーマンス両方の最適化を実現します。
—-
AMD EPYC プロセッサ
Amazon EC2 インスタンスには現在、全コアターボのクロック速度が 2.5 GHz の AMD EPYC 7000 シリーズプロセッサが搭載されています。AMD ベースのインスタンスは、お客様に新たな選択肢を提供します。コンピューティングリソースが十分に活用されていない多くのワークロードに、よりぴったりなものが見つかる可能性があります。コンピューティングリソースと使用率の間のバランスを最適化することにより、これらのインスタンスでは類似のインスタンスと比べコストを 10% 節約できます。
——
https://aws.amazon.com/jp/ec2/amd/

あれ、GCPもAzureもEPYC? これまじ?
Intelじゃなくて、CPU=AMDなんだ。。