Linuxで出てくる「x86」「AMD」「ARM」「RISC-V」とは何か?

linuxとCPUアーキテクチャ

Linuxが人気である理由は、多数の異なる CPU アーキテクチャ上で実行されることがおそらく理由の 1 つです。 Linux カーネルには、汎用コードとドライバーに加えて、それぞれのCPUアーキテクチャ固有のコンポーネントが含まれています。これにより異なる仕様のCPU上でもシステムを起動させることが可能なのです。

CPU

Linuxは複数のコンピューターアーキテクチャ上で動作します。 (ここでのコンピューターアーキテクチャはCPUファミリアと同じ意味です。) 現在使用しているLinuxがどのCPUアーキテクチャであるかを把握するにはdmidecodeコマンドを使用します。 もし出力結果が得られない場合には、lscpuコマンドを使用するのがよいでしょう。

[root@ac93e82b6845 myworking]# lscpu
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         46 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  20
  On-line CPU(s) list:   0-19
Vendor ID:               GenuineIntel
  Model name:            12th Gen Intel(R) Core(TM) i7-12700
    CPU family:          6
    Model:               151
    Thread(s) per core:  2
    Core(s) per socket:  10
    Socket(s):           1
    Stepping:            2
    BogoMIPS:            4224.00
    Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse ss
                         e2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology tsc_reliable nonstop
                         _tsc cpuid pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline
                         _timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs
                         ibpb stibp ibrs_enhanced tpr_shadow vnmi ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi
                         2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves avx_vnni u
                         mip waitpkg gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm serialize flush_l1d arch_capabili
                         ties
Virtualization features:
  Virtualization:        VT-x
  Hypervisor vendor:     Microsoft
  Virtualization type:   full
Caches (sum of all):
  L1d:                   480 KiB (10 instances)
  L1i:                   320 KiB (10 instances)
  L2:                    12.5 MiB (10 instances)
  L3:                    25 MiB (1 instance)
Vulnerabilities:
  Itlb multihit:         Not affected
  L1tf:                  Not affected
  Mds:                   Not affected
  Meltdown:              Not affected
  Mmio stale data:       Not affected
  Retbleed:              Mitigation; Enhanced IBRS
  Spec store bypass:     Mitigation; Speculative Store Bypass disabled via prctl and seccomp
  Spectre v1:            Mitigation; usercopy/swapgs barriers and __user pointer sanitization
  Spectre v2:            Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence
  Srbds:                 Not affected
  Tsx async abort:       Not affected

lscpuコマンドの実行結果、

  • cpuファミリアはx86_64
  • CPU数は20
  • CPUのモデルはIntel 12世代

さらにコンパクトな情報はuanme -aで確認できます。

[root@ac93e82b6845 myworking]# uname -a
Linux ac93e82b6845 5.15.90.1-microsoft-standard-WSL2 #1 SMP Fri Jan 27 02:56:13 UTC 2023 x86_64 GNU/Linux

CPUファミリア一覧

x86 CPUファミリア

x86アーキテクチャIntelが開発した命令セットファミリでのちにAMDに提供されます。

  • Intel 64bit cpuカーネル内部ではx64またはx86_64と表記されています。
  • Intel-32bitカーネル内部ではx86と表記されます。
  • AMD84カーネル内部ではamd64と表記されます。

アウトオブオーダー実行への依存とエネルギー効率の悪さがデメリットとしてあげられますが、 x86はいま最も使用されているCPUファミリアです。

アウト・オブ・オーダー実行(アウト・オブ・オーダーじっこう、英: out-of-order execution)とは、高性能プロセッサにおいてクロックあたりの命令実行数(IPC値)を増やし性能を上げるための手法の1つで、機械語プログラム中の命令の並び順に依らず、データなどの依存関係から見て処理可能な命令について逐次開始・実行・完了させるものである。頭文字で'OoO'あるいは'O-o-O'とも書かれる。「順序を守らない実行」の意である。

逆に逐次実行はイン・オーダー実行と呼ばれる。

from https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%A6%E3%83%88%E3%83%BB%E3%82%AA%E3%83%96%E3%83%BB%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E5%AE%9F%E8%A1%8C

x86 CPUファミリアに対する命令はx86アセンブラとして定義されており、 x86アーキテクチャは8個の汎用レジスタ (GPR) と6個のセグメントレジスタ、1個のフラグレジスタ、1個の命令ポインタを持っている。

  • RAX/EAX/AX/AL/AH : 「アキュムレータレジスタ」と呼ばれる。算術演算操作の結果が格納される。
  • RCX/ECX/CX/CL/CH : 「カウンタレジスタ」と呼ばれる。シフトローテート命令とループ命令に使用される。
  • RDX/EDX/DX/DL/DH : 「データレジスタ」と呼ばれる。算術演算操作とI/O操作に使用される。
  • RBX/EBX/BX/BL/BH : 「ベースレジスタ」と呼ばれる。セグメントモードでのDS(後述)に格納されたデータを指し示すために使用される。
  • RSP/ESP/SP : 「スタックポインターレジスタ」と呼ばれる。スタックのトップを指し示すポインタ。
  • RBP/EBP/BP : 「スタックベースポインタレジスタ」と呼ばれる。スタックのベースを指し示すのに使用される。
  • RSI/ESI/SI : 「ソースレジスタ」と呼ばれる。ストリーム操作コマンド(たとえば MOV命令)でのソース(入力元)へのポインタとして使用される。
  • RDI/EDI/DI : 「デスティネーションレジスタ」と呼ばれる。ストリーム操作コマンドでの転送先(←英語でデスティネーションという. 出力先のようなもの)へのポインタとして使用される。

ARM CPUファミリア

ARMはAcorn社から開発され、当初から消費電力を最小限に抑えることに重点を置いてます。 したがって、iphone,androidなどの多くの携帯機器にARMベースのチップが搭載されているようです。 そのほかにはRaspberry PiのようなIoT組み込みデバイスにも組み込まれており、AWSのデータセンターでもARMベースのCPUの採用が増えてきています。

高速かつ安価ですが、X86同様脆弱性があります。

RISC-Vファミリア

カルフォルニア大学バークレー校が開発したオープンなRISC規格のCPUです。 Nvidiaを含めた多くの実装が存在します。

比較的新規のCPUであるため広くは普及しておりません。

コマンドで目視する

procとcpu情報

今後、procという言葉がたくさん出てくる。 これはprocessの略であり、これが出てきたら、プロセスやCPUに関連したキーワードであると認識したほうが良い。

cpu情報を確認する

具体例:/proc/cpuinfo

まずはcpuの情報が書かれたファイルを見る。

less /proc/cpuinfo
  • processor

    • :CPUの単位。8コア存在するのであれば、0~7まである。
    • nprocコマンドと同じ
    • 例)
  • model name:CPUの名前。

  • flags:cpuが持つ機能。

    • 例)fpu : 小数点も含めた計算機能。
    • 例2)spectre_v1: 一昨年あたりにあったCPUの脆弱性に関する機能。

cpu情報を確認する手段2

lscpuコマンドでもcpuの情報を確認することが可能。

lscpu
  • サンプル実行結果
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
Address sizes: 40 bits physical, 48 bits virtual
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 60
Model name: Intel Core Processor (Haswell, no TSX, IBRS)
Stepping: 1
  • CPUアーキテクチャは:x86_64
  • 利用可能なCPUは:4
  • CPUのモデル名はIntel Core Processor

nprocコマンド

CPUの数が得られる。(coreutilsに含まれる機能)

grep -c processor /proc/cpuinfoと同じ結果が得られる。

色々なスクリプトで使われている

CPUの使用状況を調べる

topコマンド

CPUに関する情報が出てくる。

システムが高負荷になるときにどのプログラムが動いているかどうかがわかる。

  • id:アイドリング。ここの値が高ければ高いほど、何もしていないCPUの数が多い。
  • us:ユーザー単位のCPU使用率

topを押した後、1を押してみる

CPUのプロセッサーごとの詳細画面に移る。

ループするプログラムを見てみる

#!/bin/sh

while true
do
  sleep 1
  date
done

後処理、loopコマンドの終了

killall loop

プロセッサーを指定してプログラムを実行する

tasksetを指定することで、cpuのプロセッサー番号を指定して動かすことができる

taskset -c 3 ./loop &

このプログラムを実行した後、topコマンドを実行する。

CPUの数を減らす

結論:システムドライバファイルを消せば良い。

  • sys/devices/system/cpu/cpu<プロセッサー名>
ll sys/devices/system/cpu/

cpuが大量に見えるはず。 今回はcpu7を選択

cat /sys/devices/system/cpu/cpu7/online

これを実行することで、1か0かが表示される。

  • 1:cpu7は有効
  • 0:cpu0は無効

逆に、このファイルに1や0を記述することで、CPUの数を増減させることができる

例)

  • echo 0 > /sys/devices/system/cpu/cpu7/online

注意!:cpu0はオフラインにできないようになっている。