Virtual Memory(仮想メモリ)とは?

自分の能力を超えて仮想的な記憶領域を得ること
容量不足時にSSD/HDDなどに書き出す
e.g. 使用していないときはSSDに保存しておいて、使用時に取り出すなど

devtools/security-check.py
 L R, W, Xの意味がよくわかりませんね。
 L ARCH.PPC64 はPowerPCのことのように見えるが何をやっているか不明

def check_ELF_separate_code(binary):
    '''
    Check that sections are appropriately separated in virtual memory,
    based on their permissions. This checks for missing -Wl,-z,separate-code
    and potentially other problems.
    '''
    R = lief.ELF.SEGMENT_FLAGS.R
    W = lief.ELF.SEGMENT_FLAGS.W
    E = lief.ELF.SEGMENT_FLAGS.X
    EXPECTED_FLAGS = {
        # Read + execute
        '.init': R | E,
        '.plt': R | E,
        '.plt.got': R | E,
        '.plt.sec': R | E,
        '.text': R | E,
        '.fini': R | E,
        # Read-only data
        '.interp': R,
        '.note.gnu.property': R,
        '.note.gnu.build-id': R,
        '.note.ABI-tag': R,
        '.gnu.hash': R,
        '.dynsym': R,
        '.dynstr': R,
        '.gnu.version': R,
        '.gnu.version_r': R,
        '.rela.dyn': R,
        '.rela.plt': R,
        '.rodata': R,
        '.eh_frame_hdr': R,
        '.eh_frame': R,
        '.qtmetadata': R,
        '.gcc_except_table': R,
        '.stapsdt.base': R,
        # Writable data
        '.init_array': R | W,
        '.fini_array': R | W,
        '.dynamic': R | W,
        '.got': R | W,
        '.data': R | W,
        '.bss': R | W,
    }
    if binary.header.machine_type == lief.ELF.ARCH.PPC64:
        # .plt is RW on ppc64 even with separate-code
        EXPECTED_FLAGS['.plt'] = R | W
    # For all LOAD program headers get mapping to the list of sections,
    # and for each section, remember the flags of the associated program header.
    flags_per_section = {}
    for segment in binary.segments:
        if segment.type ==  lief.ELF.SEGMENT_TYPES.LOAD:
            for section in segment.sections:
                flags_per_section[section.name] = segment.flags
    # Spot-check ELF LOAD program header flags per section
    # If these sections exist, check them against the expected R/W/E flags
    for (section, flags) in flags_per_section.items():
        if section in EXPECTED_FLAGS:
            if int(EXPECTED_FLAGS[section]) != int(flags):
                return False
    return True

DDR4 DDR3 DDR2の違い

– DDR4メモリはランダムアクセスメモリの最新世代
L メモリは各世代ごとに速度と周波数が向上している
L メモリの各世代によって電気パラメーターが異なる
– DDR2(1.8V)はXP,Vista, DDR3(1.5V)はWindows 7、DDR4(1.2V)はWindows 10
– ダブルデータレートメモリは、クロック信号の上昇端と下降端の両方でプロセッサーにデータを転送する
– クロック信号は、ダウンビートとアップビートの両方で構成される
– ダブルデータレートメモリの速度はデータ転送に単一端のみを使用するシングルデータレートメモリに比べ大幅に高速
– メモリーに取り付けられている金属製のものをヒートスプレッダという

### DRAMメーカー
Samsung(約45%シェア), SK Hynix(韓国 約28%), Micron(約23% Crucialシリーズ), Nanya(台湾), Winbond(台湾), Powerchip(台湾)

### 設計
– DDR4-2400、DDR4-2666などを チップ規格、PC4-19200やPC4-21300などを モジュール規格
– メモリ基盤にメモリチップを半田付けする
L メモリチップは集積回路であり、各チップ上にはさまざまなトランジスタ、抵抗、およびコンデンサが形成されている

メモリチップもCPUのように論理回路を設計してシリコンから作られているのか。。
つまり、メモリ、CPU、マザーボードにしろ、何やるにしろ集積回路、回路設計の知識が必須と言う事か。。
Godem

電気回路: 正弦波(サイン波)交流に対する回路素子の振る舞い、インピーダンスという概念理解
制御工学: 任意の入力(例えばステップ波形など)に対する回路の応答を解析
アナログ電子回路: トランジスタの構造や特徴を理解、信号増幅の原理の理解や小信号解析といった手法

やればやるほど勉強しなきゃいけない事多すぎんな

記憶装置の原理

PCが記憶装置を制御している
– データ授受の為の情報通路: データ線、データバスと呼ばれる
– 読み出し・書込みの制御信号: R/Wを通告する
– 記憶装置のどの位置を選択するかのアドレス線

基本記憶素子をメモリセルという
主記憶装置の構造は
1. アドレス選択部
2. 制御部
3. 記憶部: 一つのアドレスに1バイト

RAM
L SRAM: 高速アクセス、フリップフロップ、バイポーラ型、MOS型のトランジスタが用いられている
L DRAM: コンデンサに電荷を蓄える
フラッシュメモリ
 大容量で書き換え可能回数の多い
キャッシュメモリ
 主記憶装置とCPUの間に小容量の高速メモリを入れる

ICメモリ

記憶装置には大きく分けて外部記憶装置と内部記憶装置がある

### 外部記憶装置
外部記憶装置にはハードディスク、CD、DVDなど
-> 機械的な駆動部分が存在するため読み書き速度が遅い

### 内部記憶装置
ICメモリは小型の回路部品であり、基板内部に組み込まれる為、内部記憶装置と言われる
記憶容量では劣るが、機械駆動部が少ない為高速
CPU周りの高速処理にICメモリが使われている

### ICメモリの内部構造
大量の2値情報を記憶する
IC内部の最小記憶単位をセルと良い、通常は1ビットを記憶する 
セルは平面上に配列されており、アクセスするためにアドレス(固有の識別番号)が使われている
行アドレスと列アドレスがあり、アドレス線の電圧がH(アクティブ)になり、列アドレスが入力されると、特定のデータ線が選ばれ、セルが読み書きの対象となる
読み書きの制御信号R/WがHになると、記憶データが出力され、Lになると記憶される

### ICメモリの分類
ROM: 読み込み専用、電源を切っても内容保持 R/W制御信号は取り除かれ、出力のみ
RAM: 読み込み書き込み自由、電源を切ると内容も消える R/W信号に応じて双方向通信に対応

メモリっていうと、文字データ、画像データなどを記憶しているように思っていたが、実際には0、1の2値データを持ってるだけなのね。えらい勘違いをしていたみたいだ。

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