• 検索結果がありません。

説明

1439

ステップは以下の通り。

1440

1. CPU状態を保存する。

1441

2. CPU状態をIHK OS MONITOR KERNEL FROZENに遷移させる。

1442

3. cpu halt()を呼びCPUを停止させる。なお、CPUNMIを受けると処理を再開する。

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. IHKOSブート時に、各物理ページがダンプ対象であるかを示す情報(以下、ダンプ

1458

対象ページリストと呼ぶ)をLinuxとMcKernelとで共有しているメモリ領域(以降、

1459

共有メモリと呼ぶ)に確保する。また、IHKMcKernelに割り当てた物理アドレス範

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. IHKOSブート時に、ダンプ対象ページリストを共有メモリに確保する。また、IHK

1499

がMcKernelに割り当てた物理アドレス範囲をダンプ対象とするように初期化する。

1500

2. IHKMcKernel起動時にダンプレベル設定オプション(-d)でダンプレベルを指定す

1501

る。IHKは共有メモリにこのダンプレベルを記録する。また、完了フラグを0に設定

1502

する。

1503

3. IHKがダンプ準備処理関数をLinuxpanic notifierに登録する。

1504

4. Linuxでpanicが発生し、登録されているダンプ準備処理関数が呼び出される。

1505

5. IHKMcKernelの各コアへ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. Linuxmakedumpfileコマンドを実行する。

1520

9. LinuxLinuxMcKernelの両方の情報を含むダンプファイルを作成する。

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) エントリに対応するアドレス範囲のうち、IHKMcKernelに割り当てた範囲に

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 IHKMcKernelに割り当てたメモリ領域を出力する。

24 カーネルが使用しているメモリ領域を出力する。

なお、args->levelが設定可能でない値であった場合は-EINVALを返却 する。

DUMP NMI CPUNMIを発行し、ダンプの準備を指示する。

DUMP SET ANONYMOUS IHKMcKernelに割り当てたメモリ領域)から(args->mem chunks, args->num mem chunksで指定したメモリ領域)を除いた領域に対し、Linux struct pagemappingフィールドの最下位ビットをセットし anony-mousテーブルに見せかける。こうすることで、Linuxmakedumpfile 該当領域をダンプ対象から除外できるようになる。

DUMP QUERY IHK に よって 割 り 当 て ら れ た 物 理 メ モ リ 領 域 の 情 報 を args->start, args->sizeに格納する。本機能は、IHKMcKernelに割り当てたメモリ 領域の全てをダンプする際に使用する。

戻り値

1566

0 正常終了

-EFAULT アドレスが不正である

-EINVAL 引数が無効である

2.13.4.1 ダンプファイルの形式

1567

ダンプファイルはELF形式を採用している。ダンプファイルで使用しているセクションは以

1568

下の通り。

1569