説明
1439
ステップは以下の通り。
1440
1. CPU状態を保存する。
1441
2. CPU状態をIHK OS MONITOR KERNEL FROZENに遷移させる。
1442
3. cpu halt()を呼びCPUを停止させる。なお、CPUはNMIを受けると処理を再開する。
1443
4. CPUが処理を再開した後、CPU状態を保存しておいた値に戻す。
1444
Linux McKernel
メモリダンプ採取(関数) ihk_makedumpfile
メモリダンプ採取(コマンド) ihkosctl(dump)
IHK-Master
(1) ダンプレベルの設定
NMI指示処理
(3) レジスタ情報を退避し、コアをhlt命令で停止 (4) (McKernel のCPU No.0のコアのみ) ダンプ対象となる物理アドレス範囲列を記録
MckKernelが停止
(8) ダンプファイル出力処理
共有メモリ領域
・ダンプレベル情報
・ダンプ対象物理アドレス範囲情報と完了フラグ (ihk_os_mem_query_page_map構造体)
Linux ダンプファイル
・McKernelの内容
・eclairの形式
McKernelイメージ
・eclairでの解析 ダンプ採取機能
ダンプ解析機能 (5) ダンプ対象のメモリ領域数
の取得
(6)ダンプ対象のメモリ領域 の取得
(7) 物理メモリの読み出し (2) McKernelへNMI指示
物理メモリ 領域
凡例
処理の流れ データアクセス
Figure 2.15: McKernel主導ダンプの場合のダンプ採取機能とダンプ形式変換機能の処理の
流れ
1. IHKがOSブート時に、各物理ページがダンプ対象であるかを示す情報(以下、ダンプ
1458
対象ページリストと呼ぶ)をLinuxとMcKernelとで共有しているメモリ領域(以降、
1459
共有メモリと呼ぶ)に確保する。また、IHKがMcKernelに割り当てた物理アドレス範
1460
囲をダンプ対象とするように初期化する。
1461
2. 管理者がihk os makedumpfile()でダンプを指示する。
1462
3. IHKが共有メモリにダンプレベルを記録する。また、共有メモリ上の、ダンプ対象ペー
1463
ジリストの設定完了を表すフラグ(以降、完了フラグと呼ぶ)を0に設定する。 (図
1464
の(1))
1465
4. IHKがMcKernelの各コアへNMIを送る。(図の(2))
1466
5. McKernelの第0 CPU以外のCPUはレジスタ情報を退避した後hlt命令で停止する
1467
(図の(3)) 。McKernelの第0 CPUは以下を実行する。(図の(3)、(4))
1468
(a) レジスタ情報を退避する。
1469
(b) 共有メモリを参照してダンプレベルを取得する。
1470
(c) ダンプからユーザ領域を除外する指定がされている場合は、ユーザメモリ領域情
1471
報を取得し、ダンプ対象ページリストの対応ビットを0にする。
1472
(d) ダンプから未使用領域を除外する指定がされている場合は、未使用メモリ領域情
1473
報を取得し、ダンプ対象ページリストの対応ビットを0にする。
1474
(e) 完了フラグに1をセットする。
1475
(f) hlt命令で停止する。
1476
6. IHKが完了フラグが1になるまで待ち、ioctl()でダンプ対象のメモリ領域数を取得
1477
し、領域情報を格納するメモリ領域を確保し、さらにioctl()でダンプ対象の領域情
1478
報を前記メモリ領域に記録する。(図の(5)、(6))
1479
7. IHKがダンプ対象のメモリ領域をioctl()で読み出し、ファイルに書き込む。(図の
1480
(7)、(8))
1481
8. 管理者はeclairを用いてダンプファイルの解析を行う。
1482
ダンプ対象はihk dump page setで表現する。定義は以下の通り。
1483
struct ihk_dump_page_set {
1484
unsigned int completion_flag; /* 書き込み完了フラグ */
1485
unsigned int count; /* ダンプ対象のページ情報数 */
1486
unsigned long page_size; /* ダンプ対象のページ情報の全体サイズ */
1487
unsigned long phy_page; /* ダンプ対象のページ情報の物理アドレス
1488
(struct ihk_dump_pageの配列) */
1489
}
1490 1491
struct ihk_dump_page {
1492
unsigned long start; /* マップ情報の開始物理アドレス */
1493
unsigned long map_count; /* マップ情報の領域数(map[]の配列数) */
1494
unsigned long map[]; /* マップ情報(ビットマップ形式) */
1495
};
1496
Linux主導ダンプの場合のダンプ採取機能とダンプ形式変換機能の処理の流れを図??を
1497
用いて説明する。
1498
Linux
IHK-Master
ダンプ準備処理
McKernel
・panic発生によりダンプ イベント実施
・ダンプレベルの設定
NMI指示処理
(2) レジスタ情報を退避し、コアをhlt命令で停止 (3) (McKernel のCPU No.0のコアのみ) ダンプ対象となる物理アドレス範囲列を記録
MckKernelが停止
共有メモリ領域
・ダンプレベル情報
・ダンプ対象物理アドレス範囲情報と完了フラグ (ihk_os_mem_query_page_map構造体)
Linux ダンプファイル
・McKernelの内容
・eclairの形式
McKernelイメージ
・eclairでの解析 ダンプ採取機能
ダンプ解析機能 (4) ダンプ対象外となる 物理アドレス範囲の取得
(5) ダンプ対象外となる 物理メモリの除外操作 (1) McKernelへNMI指示
物理メモリ領域
・page構造体 のmapping フィールド
凡例
処理の流れ データアクセス
ダンプファイル
・Linux+McKernelの内容
・makedumpfileの形式 Linux
・eclair形式ファイル 取り出し機能
・Linuxのダンプ処理 (makedumpfle)
・ダンプ準備処理をLinuxの panic_notifulerに登録
Figure 2.16: Linux主導ダンプの場合のダンプ採取機能とダンプ形式変換機能の処理の流れ
1. IHKがOSブート時に、ダンプ対象ページリストを共有メモリに確保する。また、IHK
1499
がMcKernelに割り当てた物理アドレス範囲をダンプ対象とするように初期化する。
1500
2. IHKがMcKernel起動時にダンプレベル設定オプション(-d)でダンプレベルを指定す
1501
る。IHKは共有メモリにこのダンプレベルを記録する。また、完了フラグを0に設定
1502
する。
1503
3. IHKがダンプ準備処理関数をLinuxのpanic notifierに登録する。
1504
4. Linuxでpanicが発生し、登録されているダンプ準備処理関数が呼び出される。
1505
5. IHKがMcKernelの各コアへNMIを送る。(図の(1))
1506
6. McKernelの第0 CPU以外のCPUは、レジスタ情報を退避し、hlt命令で停止する(図
1507
の(3))。McKernelの第0 CPUは以下を実行する。(図の(2)、(3)))
1508
(a) レジスタ情報を退避する。
1509
(b) 共有メモリを参照してダンプレベルを取得する。
1510
(c) ダンプからユーザ領域を除外する指定がされている場合は、ユーザメモリ領域情
1511
報を取得し、ダンプ対象ページリストにダンプからの除外を記録する。
1512
(d) ダンプから未使用領域を除外する指定がされている場合は、未使用メモリ領域情
1513
報を取得し、ダンプ対象ページリストのダンプからの除外を記録する。
1514
(e) 完了フラグに1をセットする。
1515
(f) hlt命令で停止する。
1516
7. IHKが完了フラグが1になるまで待ち、ioctl()でダンプ対象外の物理アドレス範囲
1517
に該当するLinuxのpage構造体のmappingフィールドを操作しanonymousに設定す
1518
る。(図の(4)、(5)))
1519
8. Linuxがmakedumpfileコマンドを実行する。
1520
9. LinuxがLinuxとMcKernelの両方の情報を含むダンプファイルを作成する。
1521
10. 管理者がldump2mcdumpコマンドで、makedumpfile形式のダンプファイルをeclair形
1522
式に変換する。
1523
11. 管理者はeclairを用いてダンプファイルの解析を行う。
1524
2.13.2 ユーザメモリ領域情報取得
1525
L4テーブル L3テーブル
L3テーブル L2テーブル
L2テーブル L1テーブル
L1テーブル エントリ
:
: :
: L3テーブル
エントリ
: L2テーブル
: エントリ
: L3テーブル
(1)プロセスごとのページテーブルを辿る
resource_set構造体
(2)ページテーブルツリーのリーフ であるエントリを見つける
(3) エントリに対応するアドレス範囲のうち、IHK がMcKernelに割り当てた範囲内のものを返 却する
Figure 2.17: ユーザメモリ領域情報取得処理の流れ ユーザメモリ領域情報取得処理の流れを図??を用いて説明する。
1526
1. resource setを参照して全プロセスを辿り、プロセスごとのページテーブルについて
1527
以下を行う。(図の(1))
1528
(a) ページテーブルツリーのリーフであるエントリを見つける。(図の(2))なお、4
1529
段目のエントリは4 KBページのエントリ、3段目かつPageSizeフラグが1のエ
1530
ントリは2 MB、2段めかつPageSizeフラグが1のエントリは1 GBページのエ
1531
ントリである。
1532
(b) エントリに対応するアドレス範囲のうち、IHKがMcKernelに割り当てた範囲に
1533
収まるものをユーザメモリ領域として返却する。収まらないものはエントリが破
1534
壊されているとみなし破棄する。(図の(3))
1535
2.13.3 未使用メモリ領域情報取得
1536
: NUMAノード管理情報 (ihk_mc_numa_node構造体)
[物理メモリアロケータ情報]
・未使用メモリRBツリー(rb_root構造体)
・未使用メモリ数 numa node 0
numa node n numa node 1
(2) Red Black Treeのエントリを辿る
[物理メモリアロケータ情報]
・未使用メモリRBツリーrb_root構造体)
・未使用メモリ数
[物理メモリアロケータ情報]
・未使用メモリRBツリー(rb_root構造体)
・未使用メモリ数
(1) NUMAノードごとの物理メモリアロケータを辿る
Red Black Tree
(3) エントリに記録されている物理アドレス範囲 を返却する
Figure 2.18: 未使用メモリ領域情報取得処理の流れ 未使用メモリ領域情報取得の処理の流れを図??を用いて説明する。
1537
1. NUMAノード管理情報(ihk mc numa node構造体)を参照してNUMAノードごとの物
1538
理メモリアロケータについて以下を行う。(図の(1))
1539
(a) 未使用メモリを管理するRed Black tree(rb root構造体)のエントリを辿る。(図
1540
の(2))
1541
(b) エントリ(free chunk構造体)に記録されている物理アドレス範囲を返却する。(図
1542
の(3))
1543
2.13.4 ダンプ処理用ioctl()コマンド
1544
書式
1545
int ioctl(int fd, IHK OS DUMP, struct ihk dump args *args)
1546
説明
1547
fdで指定されたOSインスタンスに対して、args->cmdに指定されたダンプ関連処理を
1548
行う。
1549
dumpargs tは以下のように定義される。
1550
struct ihk_dump_args {
1551
int cmd; /* コマンド */
1552
unsigned int level; /* ダンプレベル */
1553
long start; /* 開始物理アドレス */
1554
long size; /* サイズ */
1555
void *buf; /* メモリ内容 */
1556
int num_mem_chunks; /* メモリ領域数 */
1557
struct ihk_dump_mem_chunk *mem_chunks; /* メモリ領域情報 */
1558
};
1559
struct ihk dump mem chunkは以下のように定義される。
1560
struct ihk_dump_mem_chunk {
1561
unsigned long addr;
1562
unsigned long size;
1563
};
1564
args->cmdごとの処理は以下の通り。
1565
args->cmd 動作
DUMP_QUERY_NUM_MEM_AREAS ダンプ対象メモリ領域数を返す。
DUMP QUERY MEM AREAS ダンプ対象メモリ領域の情報をargs->mem chunksに格納する。呼び出し元 がargs->mem chunksの領域を用意する。
DUMP READ args->start, args->size で 指 定 さ れ た 物 理 メ モ リ 領 域 の 内 容 を args->bufで指定されたバッファにコピーする。
DUMP SET LEVEL ダンプ対象とするメモリ領域の種類をargs->levelに設定する。設定可能
な値は以下の通り。
0 IHKがMcKernelに割り当てたメモリ領域を出力する。
24 カーネルが使用しているメモリ領域を出力する。
なお、args->levelが設定可能でない値であった場合は-EINVALを返却 する。
DUMP NMI 全CPUにNMIを発行し、ダンプの準備を指示する。
DUMP SET ANONYMOUS (IHKがMcKernelに割り当てたメモリ領域)から(args->mem chunks, args->num mem chunksで指定したメモリ領域)を除いた領域に対し、Linux のstruct pageのmappingフィールドの最下位ビットをセットし anony-mousテーブルに見せかける。こうすることで、Linuxのmakedumpfileが 該当領域をダンプ対象から除外できるようになる。
DUMP QUERY IHK に よって 割 り 当 て ら れ た 物 理 メ モ リ 領 域 の 情 報 を args->start, args->sizeに格納する。本機能は、IHKがMcKernelに割り当てたメモリ 領域の全てをダンプする際に使用する。
戻り値
1566
0 正常終了
-EFAULT アドレスが不正である
-EINVAL 引数が無効である
2.13.4.1 ダンプファイルの形式
1567
ダンプファイルはELF形式を採用している。ダンプファイルで使用しているセクションは以
1568
下の通り。
1569